【问题标题】:How to properly serialize *-to-many relationships with DRF如何正确序列化 * 对多与 DRF 的关系
【发布时间】:2014-06-11 04:52:22
【问题描述】:

我一直在尝试使用 DRF 序列化/反序列化一些数据,但我不确定出了什么问题。


这是我的模型:

from django.db import models

class FooA(models.Model):
    propA = models.CharField(max_length=30)

class FooB(models.Model):
    propB = models.CharField(max_lenght=30)
    propC = models.ForeignKey(FooC, related_name='fooBs')

class FooC(models.Model):
    propC = models.CharField(max_lenght=30)
    fooAs = models.ManyToMany(FooA, null=True, blank=True)


这是我的序列化程序:

from rest_framework import serializers
from myModule import models

class FooASerializer(serializers.ModelSerializer):
    class Meta:
        model = models.FooA
        fields = ('propA',)

class FooBSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.FooB
        fields = ('propB',)

class FooCSerializer(serializers.ModelSerializer):
    fooBs = FooBSerializer(many=True)
    fooAs = FooASerializer(many=True, required=False)

    class Meta:
        model = models.FooC
        fields = ('fooAs', 'fooBs',)


这是我的“观点”:

from rest_framework import generics
from .serializers import FooCSerializer
from .models import FooC

class FooCList(generics.ListCreateAPIView):
    model = FooC
    serializer_class = FooCSerializer


最后,这是我的路线:

from django.conf.urls import patterns, url, include
from .views import FooCList

urlpatterns = patterns('',
    url(r'^foocs/', FooCList.as_view())
)


所以,我想做的是通过管理界面创建一些数据,然后转到 DRF api 浏览器,复制一个 FooC 对象的 JSON,稍微修改它并测试我是否能成功将其反序列化为 FooC 对象。

这是我所做的:

>>> from rest_framework.compat import BytesIO
>>> from rest_framework.parsers import JSONParser
>>> from myApp.serializers import FooCSerializer
>>>
>>> content = '<slightly modified JSON copied from the DRF api browser>'
>>> stream = BytesIO(content)
>>> data = JSONParser().parse(stream)
>>> serializer = FooCSerializer(data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
ValueError: Cannot add "<FooA: fooA>": instance is on database "default", value is on database "None"


请注意,它确实在我的数据库中创建了一个新的 FooC 实例,但它没有创建它的任何“嵌套”类(也就是 FooC 与之有关系的类)。


所以这里有几个问题:

1) 这是预期的吗?我希望它会“级联”创建所有内容。

2) 如果这是设计使然,我在构建客户端时应该如何操作? 我的意思是,我希望打开一个表单,我可以在其中创建 FooC 和所有相关的实例同一个表单中的实例。

谢谢你们!

【问题讨论】:

    标签: python django rest serialization django-rest-framework


    【解决方案1】:

    简短回答:

    1) 是的。

    2) 有可能的解决方法。

    为了让你理解我为什么对第一个问题说“是”,我建议你在这里阅读由 DRF 的创建者 Tom Christie 撰写的 https://groups.google.com/forum/#!msg/django-rest-framework/vCl2I_EzJnE/qwRdIdxiUe4J 的解释。

    现在对于解决方法,您可以:

    1) 使用 pre_save 方法在 for 循环中创建嵌套对象,然后将它们的 PK 添加到 FooC 当前实例

    2) 为您的嵌套类创建一个视图,然后使用您请求中的相应数据从该视图调用方法。

    希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 2020-09-03
      • 2018-09-21
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 2022-01-10
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多