python - 保存方法中的 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
没有找到这样做的方法,我想我必须重写保存方法并捕获唯一约束错误才能做到这一点。有任何想法吗 ?谢谢
解决方案
如果数据库中的条目已经具有相同的值,则违反 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()
推荐阅读
- node.js - Nodejs - 删除重复项,对 AZ 进行排序
- sql - 雪花无法插入多行使用插入具有 md5 字段
- c# - NLog 没有将调试事件写入日志
- http - 无法在中间件中跟踪 HTTP 响应代码
- javascript - 我如何在 redux-saga 1 秒后调度?
- discord - 如何使用 Discord.js 获取谁在观看流媒体
- python - 有人可以解释这个列表理解的功能吗?
- android - Android - 房间迁移没有正确处理 CREATE 表
- react-native - 更改 FlatList 滚动条的颜色 react native
- linux - Windows 子系统 Linux sed 突击队无法通过 bat 文件工作