2013-06-20 10 views
8

Ich frage mich, wie ich Mongoengine und DjangoRESTframework miteinander arbeiten können. Derzeit mein Modell istErhalten Mongoengine und Django Rest-Framework, um nett zu spielen

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) 

und ich habe die Serializer definiert als

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) 

Aber erhalte ich den Fehler

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) 

, die folgenden Zurückverfolgungs

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

Antwort

11

Django REST Rahmenwo rk soll gut mit Djangos Modellen funktionieren. Da MongoEngine kein Ersatz für Djangos Modelle ist, müssen Sie ein paar weitere Funktionen definieren, damit es mit dem Django Rest-Framework gut spielt.

Wenn Sie einen Framework-Build für MongoEngine benötigen, sollten Sie stattdessen einen Blick auf django-tastypie-mongoengine werfen.

Wenn Sie Django REST Framework bevorzugen, ist es jedoch durchaus möglich. Ihre BlogList Klasse ist eigentlich eine View, kein Serializer. Zuerst eine Serializer Klasse definieren:

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) 

Da das MongoEngine Dokument keine Django Modell Instanz ist, müssen Sie von serializers.ModelSerializer die Objekte selbst statt erben erstellen. Deshalb ist die Methode hier. Von der documentation: Gegeben ein Verzeichnis der deserialisierten Feldwerte, [wird] entweder eine vorhandene Modellinstanz aktualisieren oder eine neue Modellinstanz erstellen.

Dann können Sie Ihre Ansicht definieren, z.

from rest_framework import generics 
from .models import Blog 

class BlogList(generics.ListCreateAPIView): 
    serializer_class = BlogSerializer 

    def get_queryset(self): 
     return Blog.objects 

Auch hier erwartet Django REST-Framework, ein paar Dinge von einem Standard-Django-Modellen, die von MongoEngine Dokumenten nicht überprüft werden, daher die Notwendigkeit, die get_queryset Methode neu zu definieren.

Dann in Ihrem urls.py hinzu:

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

Es stellte sich heraus, mein Problem war, dass ich nicht die .as_view() in meiner Datei urls.py hatte. Was ist seltsam ist, dass ich es nicht immer für Ansichten mit Restlib2 benötigt. – user1876508

+0

Es scheint, dass restlib2 'Resource' Klassen einfache alte aufrufbare Views sind, dh' Resource() 'ruft nur 'Resource.dispatch()' auf, während Django REST Frameworks Djangos Class Based Views verwendet (http://django-rest-framework.org) /api-guide/views.html und https://docs.djangoproject.com/en/dev/topics/class-based-views/), die die Verwendung von 'as_view()' erfordern. –

1

Check out Monkful, es ist wie Django Ruhe Framework, aber es funktioniert mit MongoEngine.

+1

Dieses Tool ist für Flask gebaut, die Frage war auf Django ausgerichtet. – imarban

0

Vorlauf bis Mitte 2016. Jetzt haben wir Django-REST-Framework-Mongoengine. Es ist immer noch weit davon entfernt, eine komplette schlüsselfertige Lösung zu sein, aber zumindest die Teilfunktionalität, die es derzeit bietet, ist mit Komponententests gut abgedeckt. Also, komm, lass es uns verbessern.

+0

Unabhängig von seinen Eigenschaften, ist es stabil für die Produktion? –

+0

@Ahmed nein, ist es nicht. Aber wir kommen näher. Wir betreiben mehrere interne Dienstleistungen in unserem Unternehmen und es hat uns gut gedient. –