首页 > 解决方案 > 如何使用 UUID PrimaryKeyRelatedField 创建嵌套的 DRF 序列化程序?

问题描述

我已经简化/最小化了这里的示例(删除了指定模型和所有字段的类元,删除了一些其他显式字段),但它与用例匹配并复制了观察到的行为。

class MainSerializer(ModelSerializer):
    a = ASerializer(required=False, many=True)

    def create(self, validated_data):
        a_data = validated_data.pop("a", None)
        main_instance = super().create(validated_data)
 
        if a_data is None:
            return main_instance
 
        for a in a_data:
            a["main_relation"] = main_instance
        a_serializer = ASerializer(data=a, many=True)
        a_saved = None
        if a_serializer.is_valid():
            a_serializer.save()
            a_saved = a_serializer.data
        else:
            a_saved = a_serializer.errors

        return {
            **self.data,
            "a": a_saved.data()
        }
            
class ASerializer(ModelSerializer):
     main_relation = PrimaryKeyRelatedField(queryset=ModelB.objects.all(),
                                        required=False, allow_null=True, default=None)

最终在它说的字符串表示没有属性MainSerializer#create的地方抛出一个错误,但是当通过调试器运行时,实例肯定同时具有和属性,并且两者的值与预期的相同。那么出了什么问题呢?PrimaryKeyRelatedField#to_representationmain_instancepkpkuid

附带问题:如果不是返回字典,而是main_instance在两种情况下都返回,视图集是否会返回MainSerializer#data实例的完整表示(根据它的序列化程序包含的嵌套关系)?如果嵌套的序列化程序有错误,它们会通过该数据出现吗?或者这样的事情是否需要扩展 drf 功能?

标签: python-3.xdjangodjango-rest-framework

解决方案


推荐阅读