当我试图将一些数据反序列化到一个对象中时,如果我包含一个唯一的字段,并给它一个已经分配给数据库中某个对象的值,我会得到一个键约束错误.这是有道理的,因为它试图创建一个具有唯一值且已在使用的对象.

有没有办法为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

Django相关问答推荐

Django中的登录重定向

Django测试:如何模拟Django_apps.get_Model()的LookupError

我无法在Django模板中使用Get_Foo_Display

我的Django终结点不访问HAS_OBJECT_PERMISSION方法

如何从Django';S模型中的方法中检索值?

为什么 Django 在错误的目录中寻找模板?

root urls.py 是 Django 中的 config/urls.py 吗?

Django授权判断具有通配符模式的URL

在 GoDaddy 上安装 django 站点

在 Django CharFields 中自动截断 max_length 字段

relation "django_site" does not exist

在 Django 管理员中嵌套内联?

Django - 如何从模型中 Select 特定列?

django-object-permissions Vs django-guardian Vs django-authority

从 virtualenv 中,pip freeze > requirements.txt 给出了一堆垃圾!如何修剪它?

在 Celery 任务中运行 Scrapy 蜘蛛

在 Django 中使用 LiveServerTestCase 时使用代码登录

Django 1.7 - 如何 suppress (1_6.W001)某些元素单元测试可能无法按预期执行.?

找不到 msguniq.确保您安装了 GNU gettext 工具 0.15 或更新版本. (Django 1.8 和 OSX ElCapitan)

判断列表 django 模板中是否存在