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

Python 如何使用验证在drf中创建嵌套对象?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我想用django rest framework serializersdrf创建嵌套对象 最初,我创建这样的序列化程序: 类CollectionCreateSerializerModelSerializer: citizens=citizenSerializerName=True 序列化程序字段的一些定义 def createself,已验证的_数据: collection=collection.objects.create 公民=已验证的_数据。弹出“公民” 对于公民中的公民: citize

我想用django rest framework serializersdrf创建嵌套对象

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

类CollectionCreateSerializerModelSerializer: citizens=citizenSerializerName=True 序列化程序字段的一些定义 def createself,已验证的_数据: collection=collection.objects.create 公民=已验证的_数据。弹出“公民” 对于公民中的公民: citizen\u serializer=CitizenSerializerdata=citizen, 上下文={'citizens':公民 citizen_序列化程序。是否为_validraise_exception=True citizen\u序列化程序.save 回收 类CitizenSerializerserializers.ModelSerializer: 序列化程序字段的一些防御 def验证自身,属性: 打印“验证公民” citizens=self.context['citizens'] 公民语境下的验证逻辑 返回super.validateatrs 但这不起作用,因为validate方法调用了create方法,在它之前,当集合验证发生时。问题是在第一种情况下,上下文包含“request”和一些其他信息。在第二种情况下,上下文包含create方法上下文中定义的信息

所以,在每个公民身上使用不同的上下文信息验证方法两次

然后我尝试从create方法中删除is_valid方法。出现了下一个逻辑错误:

 You must call `.is_valid()` before calling `.save()`.
然后,我尝试将citizens值设置为真实值,只是为了防止内部验证。但是,在create方法中,citizens字段不包括在已验证的数据中


因此,我希望某些标志关闭内部嵌套对象验证?或者可能存在更好的解决方案。

实现中的问题是,您正在CollectionCreateSerializer的create方法中创建CitizenSerializer实例

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

您需要更新CollectionCreateSerializer,例如:

类CollectionCreateSerializerModelSerializer: citizens=citizenSerializerName=True 序列化程序字段的一些定义 def createself,已验证的_数据: collection=collection.objects.create 公民=已验证的_数据。弹出“公民” 对于公民中的公民: Citizen.objects.createcollection=collection,**Citizen 回收
是的,这是一个解决方案。但我有一些关于公民反序列化的逻辑。所以在这个解决方案中,我需要在CollectionSerializer中包含该逻辑。在这种情况下,这似乎并不完美。