2013-06-20 19 views
8

Tôi tự hỏi làm thế nào tôi có thể nhận được mongoengine và djangoRESTframework để làm việc với nhau. Hiện nay, mô hình của tôi làBắt mongoengine và django phần còn lại khuôn khổ để chơi đẹp

from mongoengine import * 
import datetime 

class Blog(Document): 
    post_id = IntField(unique=True) 
    title = StringField(max_length=144, required=True) 
    date_created = DateTimeField(default=datetime.datetime.now) 
    body = StringField(required=True) 

và tôi đã serializer định nghĩa là

from rest_framework.views import APIView 
from rest_framework.response import Response 
from .models import * 

class BlogList(APIView): 
    """ 
    Lists all blog posts, or creates a new post 
    """ 
    def get(self, request, format=None): 
     posts = Blog.objects.to_json() 
     return Response(posts) 

Nhưng tôi nhận được lỗi

TypeError at /blog/ 

__init__() takes exactly 1 argument (2 given) 

Request Method:  GET 
Request URL: http://127.0.0.1:8000/blog/ 
Django Version:  1.5.1 
Exception Type:  TypeError 
Exception Value:  

__init__() takes exactly 1 argument (2 given) 

mang đến cho traceback sau

response = callback(request, *callback_args, **callback_kwargs) 

Trả lời

11

Django REST Framewo rk được thiết kế để làm việc tốt với các mô hình của Django. Vì MongoEngine không phải là một sự thay thế cho các Mô hình của Django, bạn sẽ cần định nghĩa thêm một vài chức năng để nó có thể chơi tốt với khung công tác Django Rest.

Nếu bạn cần xây dựng khung công tác cho MongoEngine, bạn có thể muốn xem django-tastypie-mongoengine để thay thế.

Nếu bạn thích sử dụng khung công tác Django REST thì điều này hoàn toàn khả thi. Lớp BlogList của bạn thực sự là Chế độ xem chứ không phải là Trình nối tiếp. Đầu tiên, xác định một lớp serializer:

from rest_framework import serializers 
from .models import Blog 

class BlogSerializer(serializers.Serializer): 
    post_id = serializers.IntegerField() 
    title = serializers.CharField(max_length=144) 
    date_created = serializers.DateTimeField(required=False) 
    body = serializers.CharField() 

    def restore_object(self, attrs, instance=None): 
     if instance is not None: 
      for k, v in attrs.iteritems(): 
       setattr(instance, k, v) 
      return instance 
     return Blog(**attrs) 

Kể từ khi Document MongoEngine không phải là một trường hợp Django Model, bạn cần phải tạo ra các đối tượng chính mình thay vì kế thừa từ serializers.ModelSerializer. Đó là lý do tại sao phương pháp restore_object có tại đây. Từ documentation: Cho một từ điển các giá trị trường deserialized, [nó sẽ] hoặc cập nhật một cá thể mô hình hiện có, hoặc tạo một cá thể mô hình mới.

Sau đó, bạn có thể xác định chế độ xem của mình, ví dụ:

from rest_framework import generics 
from .models import Blog 

class BlogList(generics.ListCreateAPIView): 
    serializer_class = BlogSerializer 

    def get_queryset(self): 
     return Blog.objects 

Một lần nữa, Django REST của Khung hy vọng một vài điều về một mô hình Django tiêu chuẩn mà không được xác nhận qua Documents MongoEngine, vì vậy cần phải xác định lại phương pháp get_queryset.

Sau đó, trong urls.py của bạn, thêm:

url(r'^blog/', BlogList.as_view(), name='blog-list'), 
+0

Hóa ra vấn đề của tôi là tôi không có tệp .as_view() trong tệp urls.py của mình. Điều kỳ lạ là tôi không phải lúc nào cũng cần nó cho các khung nhìn bằng cách sử dụng restlib2. – user1876508

+0

Có vẻ như các lớp 'Resource' của restlib2 là các dạng xem cũ có thể gọi được, nghĩa là' Resource() 'chỉ gọi' Resource.dispatch() 'trong khi khung công tác REST của Django sử dụng Chế độ xem dựa trên Lớp của Django (http://django-rest-framework.org /api-guide/views.html và https://docs.djangoproject.com/en/dev/topics/class-based-views/) yêu cầu sử dụng 'as_view()'. –

1

Check-out Monkful, nó giống như Django Nghỉ ngơi Framework, nhưng nó hoạt động với MongoEngine.

+1

Công cụ này được xây dựng cho Flask, câu hỏi được định hướng đến Django. – imarban

0

Tua tới giữa năm 2016. Bây giờ chúng tôi có Django-REST-Framework-Mongoengine. Nó vẫn còn khá xa là một giải pháp chìa khóa trao tay hoàn chỉnh, nhưng ít nhất là một phần chức năng mà nó hiện đang cung cấp cũng được bao phủ với các bài kiểm tra đơn vị. Vì vậy, hãy tiếp tục, hãy cải thiện nó.

+0

Bất kể tính năng của nó là gì, nó có ổn định cho sản xuất không? –

+0

@Ahmed no, it is not. Nhưng chúng tôi đang tiến gần hơn. Chúng tôi chạy một số dịch vụ nội bộ trên đó trong công ty của chúng tôi và nó phục vụ tốt cho chúng tôi. –