如何使用验证在drf中创建嵌套对象?

2024-06-06 09:39:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用django rest框架序列化程序(drf)创建嵌套对象。你知道吗

最初,我创建这样的序列化程序:

class CollectionCreateSerializer(ModelSerializer):
   citizens = CitizenSerializer(many=True)

   ## Some definition of serializer fields


    def create(self, validated_data):
        collection = Collection.objects.create()
        citizens = validated_data.pop('citizens')

        for citizen in citizens:
            citizen_serializer = CitizenSerializer(data=citizen,
                                                   context={'citizens': citizens)
            citizen_serializer.is_valid(raise_exception=True)
            citizen_serializer.save()

        return collection

class CitizenSerializer(serializers.ModelSerializer):


   ## Some defenition of serializer fields



    def validate(self, attrs):
        print('in validate citizen')
        citizens = self.context['citizens']

        ## Some validation logic with citizens context

        return super().validate(attrs)

但这并没有起作用,因为validate方法从create方法调用,并且在它之前发生集合验证。问题是,在第一种情况下,上下文包含“request”和一些其他信息。在第二种情况下,context包含在create方法context中定义的内容。你知道吗

因此,对每个公民使用不同的上下文信息调用两次来验证方法。你知道吗

然后我尝试从create方法中删除is\ u valid方法。出现下一个逻辑错误:

 You must call `.is_valid()` before calling `.save()`.

然后我试图让公民的价值观真实化,只是为了防止内部验证。但是公民字段不包括在create方法的验证数据中。你知道吗

所以我希望某个关闭内部嵌套对象验证的标志?或者有更好的解决办法。你知道吗


Tags: 方法selfdata序列化iscreatecontextsome
1条回答
网友
1楼 · 发布于 2024-06-06 09:39:18

实现中的问题是,您正在CollectionCreateSerializercreate方法中创建一个CitizenSerializer实例。你知道吗

您不应该这样做,因为CitizenSerializer被定义为嵌套的序列化程序字段,因此在创建CollectionCreateSerializer实例时它已经被调用和验证。有关详细信息,请参见此example。你知道吗

您需要更新CollectionCreateSerializer,例如:

class CollectionCreateSerializer(ModelSerializer):
   citizens = CitizenSerializer(many=True)

   ## Some definition of serializer fields


    def create(self, validated_data):
        collection = Collection.objects.create()

        citizens = validated_data.pop('citizens')
        for citizen in citizens:
            Citizen.objects.create(collection=collection, **citizen)

        return collection

相关问题 更多 >