2013-06-20 16 views
8

Zastanawiam się, jak mogę uzyskać mongoengine i djangoRESTframework do pracy ze sobą. Obecnie mój model jestUzyskiwanie mongoengine i reszta django rest do grania fajnie

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) 

i mam serializer zdefiniowany jako

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) 

Ale otrzymuję błąd

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) 

co daje następujące traceback

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

Odpowiedz

11

Django REST Framewo rk jest przeznaczony do pracy z modelami Django. Ponieważ MongoEngine nie zastępuje modeli Django, będziesz musiał zdefiniować kilka dodatkowych funkcji, które pozwolą mu grać ładnie z frameworkiem Django Rest.

Jeśli potrzebujesz kompilacji ramowej dla MongoEngine, możesz zamiast tego spojrzeć na django-tastypie-mongoengine.

Jeśli wolisz używać Django REST Framework, jest to całkowicie wykonalne. Twoja klasa BlogList jest w rzeczywistości widokiem, a nie serializatorem. Po pierwsze, należy zdefiniować klasę 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) 

Ponieważ MongoEngine Dokument nie jest instancją Django modelu, trzeba stworzyć obiekty samemu zamiast dziedziczenie z serializers.ModelSerializer. Dlatego jest tutaj metoda restore_object. Od documentation: Biorąc pod uwagę słownik zserializowanych wartości pól, [to] albo zaktualizuje istniejącą instancję modelu, albo utworzy nową instancję modelu.

Następnie możesz zdefiniować swój widok, np.

from rest_framework import generics 
from .models import Blog 

class BlogList(generics.ListCreateAPIView): 
    serializer_class = BlogSerializer 

    def get_queryset(self): 
     return Blog.objects 

Znowu Django REST ramowa przewiduje kilka rzeczy standardowego modelu Django, które nie zostały zweryfikowane przez MongoEngine dokumenty, stąd konieczność przedefiniowania sposobu get_queryset.

Następnie w urls.py dodać:

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

Okazało się, że moim problemem było to, że nie miałem pliku .as_view() w moim pliku urls.py. Dziwne jest to, że nie zawsze potrzebowałem tego do widoków przy użyciu restlib2. – user1876508

+0

Wygląda na to, że restlib2 Klasy 'Resource' są zwykłymi widokami, które można wywoływać, tzn.' Resource() 'wywołuje po prostu' Resource.dispatch() 'podczas gdy Django REST Frameworks używa widoków opartych na klasach Django (http://django-rest-framework.org /api-guide/views.html i https://docs.djangoproject.com/en/dev/topics/class-based-views/), które wymagają użycia 'as_view()'. –

1

Wyjazd Monkful, to jak Django Rest Framework, ale działa z MongoEngine.

+1

To narzędzie jest zbudowane dla Flask, pytanie było zorientowane na Django. – imarban

0

Szybkie przewijanie do połowy 2016 r. Teraz mamy Django-REST-Framework-Mongoengine. Nadal nie jest to kompletne rozwiązanie "pod klucz", ale przynajmniej częściowa funkcjonalność, którą obecnie zapewnia, jest dobrze pokryta testami jednostkowymi. No dalej, poprawmy to.

+0

Bez względu na jego cechy, czy jest stabilny do produkcji? –

+0

@Ahmed no, nie jest. Ale zbliżamy się. W naszej firmie prowadziliśmy kilka wewnętrznych usług i dobrze nam to służyło. –

Powiązane problemy