Django的REST:嵌套的对象添加上创建(POST)不只是更新(PUT)(Django REST

2019-08-17 02:26发布

使用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,所以它更有意义,最终用户的名字吗?

Answer 1:

写嵌套串行的全面支持是一个进展中的工作 ,但在此时间一个解决方案是重写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)

也许并不理想,但它为我工作,直到合适的方式走来。



Answer 2:

我曾在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


Answer 3:

这是现在支持(我使用的版本2.3.6,但它可能是前面介绍过)。 您可以在串行direcly使用它像这样:

class SongSerializer(serializers.ModelSerializer):
    class Meta:
        model = Song

class AlbumSerializer(serializers.ModelSerializer):
    songs = SongSerializer(many=True)

    class Meta:
        model = Album

希望能帮助到你 :)



文章来源: Django REST: Nested object add on create (POST) not just update (PUT)