use*_*508 9 django mongoengine django-rest-framework
我想知道如何让mongoengine和djangoREST框架相互合作.目前,我的模型是
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)
Run Code Online (Sandbox Code Playgroud)
我将序列化程序定义为
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)
Run Code Online (Sandbox Code Playgroud)
但是我收到了错误
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)
Run Code Online (Sandbox Code Playgroud)
这给出了以下回溯
response = callback(request, *callback_args, **callback_kwargs)
Run Code Online (Sandbox Code Playgroud)
Nic*_*tot 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)
Run Code Online (Sandbox Code Playgroud)
由于MongoEngine文档不是Django Model实例,因此您需要自己创建对象而不是继承serializers.ModelSerializer.这就是这个restore_object方法的原因.从文档中:给定反序列化字段值的字典,[它将]更新现有模型实例,或创建新模型实例.
然后你可以定义你的视图,例如
from rest_framework import generics
from .models import Blog
class BlogList(generics.ListCreateAPIView):
serializer_class = BlogSerializer
def get_queryset(self):
return Blog.objects
Run Code Online (Sandbox Code Playgroud)
同样,Django REST Framework期望一些标准的Django模型没有被MongoEngine Documents验证,因此需要重新定义该get_queryset方法.
然后在你的urls.py中添加:
url(r'^blog/', BlogList.as_view(), name='blog-list'),
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6679 次 |
| 最近记录: |