我想用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方法的验证数据中。你知道吗
所以我希望某个关闭内部嵌套对象验证的标志?或者有更好的解决办法。你知道吗
实现中的问题是,您正在
CollectionCreateSerializer
的create
方法中创建一个CitizenSerializer
实例。你知道吗您不应该这样做,因为
CitizenSerializer
被定义为嵌套的序列化程序字段,因此在创建CollectionCreateSerializer
实例时它已经被调用和验证。有关详细信息,请参见此example。你知道吗您需要更新
CollectionCreateSerializer
,例如:相关问题 更多 >
编程相关推荐