使用Django的休息
下面是我怎么了我的serializer.py。
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = ('id', 'name', 'active', 'type')
类型是flatview
后来我改之以“型”是嵌套像这样每个配置文件...
class TypeSerializer(serializers.ModelSerializer):
class Meta:
model = Type
fields = ('id', 'name', 'active')
class ProfileSerializer(serializers.ModelSerializer):
type = TypeSerializer()
class Meta:
model = Profile
fields = ('id', 'name', 'active', 'type'')
现在这个完美的作品,但是当轮廓细节它现在只读我现在只能更新“类型”。
我怎样才能创建一个新的配置文件时,仍然保持这种嵌套视图中添加类型?
我希望我已经解释清楚这一点。
更新:
好吧,我刚刚看了这样的:
注:嵌套的序列化只适用于只读表示,因为有些情况下,如果在更新情况下使用时,他们将有歧义或不明显的行为的情况。 对于读写表示你应该总是用平表示,通过使用RelatedField的一个子类。
这样才有意义。 所以我改成了....
type = serializers.PrimaryKeyRelatedField()
这使它回到POST和工作,但它是一个耻辱,我不能代表“类型”与ID,所以它更有意义,最终用户的名字吗?
写嵌套串行的全面支持是一个进展中的工作 ,但在此时间一个解决方案是重写create
在每种情况下的视图方法:
class FooListCreateView(ListCreateAPIView):
model = Foo
serializer_class = FooSerializer
def create(self, request, *args, **kwargs):
data=request.DATA
f = Foo.objects.create()
# ... create nested objects from request data ...
# ...
return Response(serializer.data,
status=status.HTTP_201_CREATED,
headers=headers)
也许并不理想,但它为我工作,直到合适的方式走来。
我曾在Django的REST的框架同样的问题,我已经创造了这样一个视图真正的快,你可以找到它在这个要点: https://gist.github.com/edulix/5311365
CRUDManyToManyView的基本用法如下:
views.py
from models import Project
from serializers import TaskSerializer
from lib.crudmanytomanyview import CRUDManyToManyView
class ProjectTasks(CRUDManyToManyView):
model = Project
field_name = 'tasks'
serializer_class = TaskSerializer
urls.py
from django.conf.urls import patterns, url
import views
urlpatterns = patterns(
'',
url(r'^projects/(?P<pk>[0-9]+)/tasks/((?P<field_pk>[0-9]+)/)?$',
views.ProjectTasks.as_view()),
)
serializers.py
from rest_framework import serializers
from models import Task
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = ('id', 'name')
models.py
from django.db import models
class Task(models.Model):
name = models.CharField(max_length=140, blank=False, null=False)
class Project(models.Model):
name = models.CharField(max_length=140, blank=False, null=False)
tasks = models.ManyToManyField(Task, related_name='projects')
然后,你可以做这样的事情:
- GET项目/ 12 /任务/将列出项目任务
- POST项目/ 12 /任务/ 1 /这将任务1添加到项目12个任务列表(任务1必须已经存在)
- 删除的项目/ 12 /任务/ 1 /将从项目12个任务列表中删除任务1
这是现在支持(我使用的版本2.3.6,但它可能是前面介绍过)。 您可以在串行direcly使用它像这样:
class SongSerializer(serializers.ModelSerializer):
class Meta:
model = Song
class AlbumSerializer(serializers.ModelSerializer):
songs = SongSerializer(many=True)
class Meta:
model = Album
希望能帮助到你 :)