当我试图将一些数据反序列化到一个对象中时,如果我包含一个唯一的字段,并给它一个已经分配给数据库中某个对象的值,我会得到一个键约束错误.这是有道理的,因为它试图创建一个具有唯一值且已在使用的对象.
有没有办法为ModelSerializer提供get_或create类型的功能?我希望能够为序列化程序提供一些数据,如果存在具有给定唯一字段的对象,那么只需返回该对象即可.
当我试图将一些数据反序列化到一个对象中时,如果我包含一个唯一的字段,并给它一个已经分配给数据库中某个对象的值,我会得到一个键约束错误.这是有道理的,因为它试图创建一个具有唯一值且已在使用的对象.
有没有办法为ModelSerializer提供get_或create类型的功能?我希望能够为序列化程序提供一些数据,如果存在具有给定唯一字段的对象,那么只需返回该对象即可.
根据我的经验,nmgeek的解决方案在DRF3+中不起作用,因为serializer.is_valid()
正确地遵守了模型的UNIQUE_Together约束.您可以通过删除UniqueTogetherValidator
并覆盖序列化程序的create
方法来解决此问题.
class MyModelSerializer(serializers.ModelSerializer):
def run_validators(self, value):
for validator in self.validators:
if isinstance(validator, validators.UniqueTogetherValidator):
self.validators.remove(validator)
super(MyModelSerializer, self).run_validators(value)
def create(self, validated_data):
instance, _ = models.MyModel.objects.get_or_create(**validated_data)
return instance
class Meta:
model = models.MyModel