首页 > 解决方案 > 保存方法中的 Django 模型管理 UNIQUE 约束错误

问题描述

这是 Python 3.8 和 Django 3.1.3

我有一个具有独特领域的模型

class SomeModel(models.Model):
    name = models.CharField(max_length=200, unique=True)

如果存在 UNIQUE 约束违规,我正在寻找一种自动更改字段值的方法

如果我创建了一个名称为“kevin”的新实例,而另一个实例已经存在同名“kevin”,那么当调用 save() 时,它将更改新实例的名称并带有后缀

例如:数据库为空

>>> foo = SomeModel()
>>> foo.name = "kevin"
>>> foo.save()

# again
>>> foo = SomeModel()
>>> foo.name = "kevin"
>>> foo.save()

# and again
>>> foo = SomeModel()
>>> foo.name = "kevin"
>>> foo.save()


>>> for foo in SomeModel.objects.all():
>>>    print(foo.name)

kevin
kevin_01
kevin_02

没有找到这样做的方法,我想我必须重写保存方法并捕获唯一约束错误才能做到这一点。有任何想法吗 ?谢谢

标签: pythondjangodjango-modelsorm

解决方案


如果数据库中的条目已经具有相同的值,则违反 UNIQUE 约束的模型实例将引发 IntegrityError,因此处理此问题的传统方法是使用 try/except 块在模型上的自定义保存方法中。

from django.db import IntegrityError

class SomeModel(models.Model):
    name = models.CharField(max_length=200, unique=True)

    def save(self, *args, **kwargs):
        try:
            self.name = 'kevin'
            super(SomeModel, self).save(*args, **kwargs)
            doSomething()
        except IntegrityError:
            doSomethingElse()

推荐阅读