让mongoengine和django休息框架玩得很好

时间:2013-06-20 18:56:49

标签: django mongoengine django-rest-framework

我想知道如何让mongoengine和djangoRESTframework互相合作。目前,我的模型是

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)

3 个答案:

答案 0 :(得分:11)

Django REST Framework旨在与Django的模型配合使用。由于MongoEngine不是Django模型的替代品,因此您需要定义更多函数才能与Django Rest框架配合使用。

如果您需要为MongoEngine构建框架,您可能需要查看django-tastypie-mongoengine

如果您更喜欢使用Django REST Framework,那么它是完全可行的。您的BlogList类实际上是View,而不是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)

由于MongoEngine文档不是Django Model实例,因此您需要自己创建对象,而不是继承自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 Framework需要一些未经MongoEngine文档验证的标准Django模型,因此需要重新定义get_queryset方法。

然后在你的urls.py中添加:

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

答案 1 :(得分:1)

查看Monkful,它就像Django Rest Framework,但它适用于MongoEngine。

答案 2 :(得分:1)

快进到2016年年中。现在我们有Django-REST-Framework-Mongoengine。它仍然远不是一个完整的交钥匙解决方案,但至少它目前提供的部分功能完全由单元测试覆盖。所以,来吧,让我们改进它。