【问题标题】:Django REST Framework: nested serializers and deserializingDjango REST Framework:嵌套序列化器和反序列化
【发布时间】:2024-01-12 06:21:01
【问题描述】:

我再次被 Django REST Framework 及其序列化程序卡住了。

基本上,我想做的是将以下传入数据粘贴到 serializers.Serializer 实例中:

data = {
    "thing_id": 715,
    "sub_things": [
        {
            "id": 1,
            "name": "bob"
        },

        {
             "id": 2,
             "name": "mike"
        }
    ]
}

sub_things 由名为 SubThingSerializer 的 serializers.ModelSerializer 处理。这就是它的样子。

class SubThingSerializer(serializers.ModelSerializer):
    class Meta:
        model = SubThing
        fields = ('id', 'name')
        read_only_fields = ('id', 'name')

Thing 的序列化由 ThingSerializer 处理,我现在处理如下:

class ThingSerializer(serializers.Serializer):
    thing_id = serializers.IntegerField()
    sub_things= SubThingSerializer(many=True)

现在,当我这样做时

serializer = ThingSerializer(data=data)

我得到空的 OrderedDicts,例如:

{'sub_things': [OrderedDict(), OrderedDict()], 'thing_id': 715}

我认为说 ThingSerializer 不需要存储到数据库中是明智的,但它确实使用了数据库中的 sub_things。这些也不会写入数据库。这只是为了跟踪事物包含的 sub_things,在浏览器客户端和 Python 对象之间来回传递这些数据以进行一些计算。并且可能将其存储在会话中。

编辑 1:

很可能我需要在我的 ThingSerializer 的 create 方法中添加一些内容。所以,我想最终的问题是:将 sub_thing 数据传递给 SubThingSerializers 的正确语法是什么?

编辑 2:

我又挖了一点。似乎由于某种原因,空的 OrderedDicts 在 valid_data 中传递给 ThingSerializer.create() 。序列化器使用 serializer.is_valid() 验证是否正常。我可以从 initial_data 访问必要的数据,但这似乎不太可靠。

编辑 3:

还使用 serializers.ListField() 对 sub_things 进行了测试。在 create 方法中的validated_data 中仍然看到空的OrderedDicts。

【问题讨论】:

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


    【解决方案1】:

    终于想通了。我的 SubThingSerializer 上的 read_only_fields 阻止了数据通过验证,从而导致创建空字典。我使用 read_only_fiels 来防止将不存在的 sub_thing 数据传递给我的代码,但我想我需要找到另一种方法。

    【讨论】: