当我尝试将一些数据反序列化到对象中时,如果我包含一个唯一字段并为其提供已分配给数据库中对象的值,则会收到关键约束错误。这很有意义,因为它试图创建具有唯一值的对象,该对象已经在使用中。

有没有办法为ModelSerializer提供get_or_create功能类型?我希望能够为Serializer提供一些数据,如果存在具有给定唯一字段的对象,则只需返回该对象。

最佳答案

以我的经验,nmgeek的解决方案无法在DRF 3+中使用,因为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

关于django - Django REST Framework ModelSerializer的get_or_create功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25026034/

10-12 17:17