2013-06-20 4 views
8

Je me demande comment je peux faire fonctionner mongoengine et djangoRESTframework les uns avec les autres. À l'heure actuelle, mon modèle estObtenir le cadre de repos mongoengine et django pour jouer sympa

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) 

et j'ai le sérialiseur défini comme

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) 

Mais je reçois l'erreur

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) 

qui donne le retraçage suivant

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

Répondre

11

Django REST Cadre rk est destiné à bien fonctionner avec les modèles de Django. Comme MongoEngine ne remplace pas les modèles de Django, vous devrez définir quelques fonctions supplémentaires pour qu'il fonctionne correctement avec le framework Django Rest.

Si vous avez besoin d'une construction de structure pour MongoEngine, vous pouvez jeter un oeil à django-tastypie-mongoengine à la place.

Si vous préférez utiliser Django REST Framework, c'est parfaitement faisable. Votre classe BlogList est en fait une vue, pas un sérialiseur. Tout d'abord, définir une classe sérialiseur:

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) 

Puisque le document MongoEngine n'est pas une instance de modèle Django, vous devez créer les objets vous-même au lieu d'hériter de serializers.ModelSerializer. C'est pourquoi la méthode restore_object est ici. A partir du documentation: Étant donné un dictionnaire de valeurs de champs désérialisées, [il va] soit mettre à jour une instance de modèle existante, soit créer une nouvelle instance de modèle.

Ensuite, vous pouvez définir votre vue, par ex.

from rest_framework import generics 
from .models import Blog 

class BlogList(generics.ListCreateAPIView): 
    serializer_class = BlogSerializer 

    def get_queryset(self): 
     return Blog.objects 

Encore une fois, cadre Django REST attend quelques choses de modèles standards de Django qui ne sont pas vérifiées par des documents MongoEngine, d'où la nécessité de redéfinir la méthode get_queryset.

Ensuite, dans votre urls.py, ajoutez:

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

Il s'est avéré que mon problème était que je n'avais pas le fichier .as_view() dans mon fichier urls.py. Ce qui est bizarre, c'est que je n'en ai pas toujours eu besoin pour les vues en utilisant restlib2. – user1876508

+0

Il semble que les classes restlib2 'Resource' soient de simples vues appelables, ie' Resource() 'appelle simplement' Resource.dispatch() 'alors que Django REST Frameworks utilise les vues basées sur les classes de Django (http://django-rest-framework.org /api-guide/views.html et https://docs.djangoproject.com/en/dev/topics/class-based-views/) qui nécessitent l'utilisation de 'as_view()'. –

1

Découvrez Monkful, il est comme Django reste-cadre, mais il fonctionne avec MongoEngine.

+1

Cet outil est construit pour Flask, la question était orientée vers Django. – imarban

0

Avance rapide jusqu'à la mi-2016. Nous avons maintenant Django-REST-Framework-Mongoengine. Il est encore loin d'être une solution clé en main complète, mais au moins la fonctionnalité partielle qu'il fournit actuellement est bien couverte par des tests unitaires. Alors, allez, améliorons-le.

+0

Indépendamment de ses caractéristiques, est-il stable pour la production? –

+0

@Ahmed non, ce n'est pas. Mais nous nous rapprochons. Nous avons plusieurs services internes dans notre entreprise et cela nous a bien servis. –

Questions connexes