【问题标题】:Double-nested serializers with Django Rest Framework使用 Django Rest Framework 的双嵌套序列化程序
【发布时间】:2015-12-10 22:05:33
【问题描述】:

DRF 是否可以使用 ModelSerializers?如果可能的话,我最感兴趣的是查看一个可以重现的示例。

这是我的模型:

class Grandparent(Model):
    g_name = CharField(max_length=10)
    parent = ForeignKey('Parent')

class Parent(Model):
    p_name = CharField(max_length=10)
    child = ForeignKey('Child')

class Child(Model):
    c_name = CharField(max_length=10)

这是我的序列化程序:

class ChildSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Child
        fields = ('id', 'c_name')

class ParentSerializer(serializers.ModelSerializer):
    child = ChildSerializer()

    def create(self, validated_data):
        child_data = validated_data.pop('child')
        child, _ = models.Child.objects.get_or_create(**child_data)
        return models.Parent.objects.create(child=child, **validated_data)

    class Meta:
        model = models.Parent
        fields = ('id', 'p_name', 'child')

class GrandparentSerializer(serializers.ModelSerializer):
    parent = ParentSerializer()

    class Meta:
        model = models.Grandparent
        fields = ('id', 'g_name', 'parent')

这是我的祖父母观点:

class GrandparentList(generics.ListCreateAPIView):
    queryset = models.Grandparent.objects.all()
    serializer_class = serializers.GrandparentSerializer

这是我尝试发布到祖父母视图时遇到的错误:

/grandparents/ 'list' 对象的 AttributeError 没有属性 'get'

【问题讨论】:

  • 代码当前不一致,报错。没有堆栈跟踪。目前,由于 GrandparentSerializer 中没有创建,DRF 会抱怨添加它或将其声明为只读
  • 你试过运行它吗?我原以为是这种情况,但我收到了列表错误。
  • 我尝试覆盖祖父母的 create 方法,但在引发异常之前它甚至没有被调用。
  • 我已经运行了该代码并得到了 DRf 抱怨 GrandparentSerializer 创建方法或只读缺失的错误
  • 您使用的是什么版本的 DRF?我正在使用 3.2.3。

标签: python django serialization django-rest-framework


【解决方案1】:

我们发现的问题是 DRF 提供的表单前端中的一个错误。直接通过 HTTP 调用时,嵌套序列化程序的行为正确。

【讨论】:

  • 我在 Stack Exchange 上遇到了您的一个问题“这种数据挖掘方法有效吗?这是个好主意吗?”你有没有得出任何结论,我也面临同样的问题,请建议我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 2018-07-06
  • 1970-01-01
  • 2018-12-15
  • 2014-08-20
  • 1970-01-01
  • 2018-07-04
相关资源
最近更新 更多