Django模型在保存方法中出现唯一约束错误。

4
这是使用Python 3.8和Django 3.1.3。
我有一个带有唯一字段的模型。
class SomeModel(models.Model):
    name = models.CharField(max_length=200, unique=True)

我正在寻找一种自动更改字段值的方法,如果存在唯一约束冲突的话。

如果我创建一个新实例,其中name="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

找不到做这件事的方法,我想我必须重写保存方法并捕获唯一约束错误来完成。有什么建议吗? 谢谢

1个回答

4

如果数据库中已经存在相同的值,违反唯一约束的模型实例会引发完整性错误(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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接