2013-06-20 15 views
8

私はmongoengineとdjangoRESTframeworkをどのようにして相互に動作させることができるのでしょうか?現在、私のモデルはmongoengineとdjango restフレームワークを取得するのが好きです

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) 

であり、私はシリアライザは

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) 

のように定義している。しかし、私は、次のトレースバックを与えるエラー

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) 

を受け付けております

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

答えて

11

Django REST Framewo rkはDjangoのモデルでうまく動作するように意図されています。 MongoEngineはDjangoのモデルを置き換えるものではないので、Django Restフレームワークでうまくいくようにいくつかの関数を定義する必要があります。

MongoEngineのフレームワークビルドが必要な場合は、代わりにdjango-tastypie-mongoengineを参照してください。

もしあなたがDjango RESTフレームワークを使いたいなら、それは完全に実現可能です。 BlogListクラスは、実際にはシリアライザではなく、ビューです。まず、シリアライザクラス定義:MongoEngineドキュメントはDjangoのモデルインスタンスではありませんので

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) 

を、自分の代わりにserializers.ModelSerializer継承のオブジェクトを作成する必要があります。そのため、restore_objectメソッドがここにあります。 documentationから:デシリアライズされたフィールド値の辞書があれば、既存のモデルインスタンスを更新するか、新しいモデルインスタンスを作成します。

次に、ビューを定義することができます。

from rest_framework import generics 
from .models import Blog 

class BlogList(generics.ListCreateAPIView): 
    serializer_class = BlogSerializer 

    def get_queryset(self): 
     return Blog.objects 

ここでも、DjangoのRESTフレームワークはget_queryset方法を再定義する必要があるため、MongoEngine文書によって検証されていない標準のDjangoのモデルのいくつかのことを期待しています。あなたのurls.pyで次に

、追加:

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

私の問題は、私のurls.pyファイルに.as_view()がないことが判明しました。変わったことは、restlib2を使ったビューでは必ずしも必要というわけではないということです。 – user1876508

+0

これはrestlib2と思われます。 'Resource'クラスは普通の呼び出し可能なビューです。つまり、' Resource() 'は単に' Resource.dispatch() 'を呼び出すのに対し、Django RESTフレームワークはDjangoのクラスベースのビュー(http://django-rest-framework.org) /api-guide/views.htmlとhttps://docs.djangoproject.com/en/dev/topics/class-based-views/)には 'as_view()'が必要です。 –

1

Monkfulをチェックアウト、それはDjangoの残りのフレームワークのようなものだが、それはMongoEngineで動作します。

+1

このツールはFlaskのために作られていますが、問題はDjangoに向けられています。 – imarban

0

2016年半ばまでの早送り。今はDjango-REST-Framework-Mongoengineです。まだ完全なターンキーソリューションではありませんが、少なくとも現在提供されている部分的な機能は単体テストで十分カバーされています。さあ、改善しましょう。

+0

その特徴にかかわらず、それは生産のために安定していますか? –

+0

@Ahmedいいえ、そうではありません。しかし、我々は近づいている。私たちは社内でいくつかの内部サービスを実行しており、それは私たちにはうまくいきました。 –

関連する問題