python - Django 模型在保存方法中管理 UNIQUE 约束错误

标签 python django django-models orm

这是 Python 3.8 和 Django 3.1.3

我有一个带有唯一字段的模型

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

我正在寻找一种在违反唯一约束时自动更改字段值的方法

如果我创建一个名称为“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

没有找到执行此操作的方法,我想我必须重写保存方法并捕获唯一约束错误才能执行此操作。有任何想法吗 ? 谢谢

最佳答案

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

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()

关于python - Django 模型在保存方法中管理 UNIQUE 约束错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65111616/

相关文章:

python - 在 PyQt5 中嵌入终端

python - Python 3.x 中有什么新内容?

python - 如何修复 2 位数总和的 python 代码中的 ValueError?

django - django中的无符号整数字段

django modelformset_factory 即使在成功创建对象后也能维持先前提交的数据

python - 为迭代器的每个元素创建一个包含 2 个条目的列表

python - 根据模型将 'all' 值添加到外键表单字段?

django - Django TextField和CharField正在剥离空格和空白行

python - 如何在用户资源中插入 user_permissions 字段?

django - 在保存之前将数据添加到 Django 表单?