Python 正在为新记录创建自定义唯一Id,但存在重复错误
创建一个id并尝试插入一条记录,但出现重复错误 django.db.utils.IntegrityError:(1062,“1062(23000):重复条目 “715683160”用于关键“项目”\u project.PRIMARY“23000”)Python 正在为新记录创建自定义唯一Id,但存在重复错误,python,django-models,Python,Django Models,创建一个id并尝试插入一条记录,但出现重复错误 django.db.utils.IntegrityError:(1062,“1062(23000):重复条目 “715683160”用于关键“项目”\u project.PRIMARY“23000”) 如何防止id重复?unique=True是否不足以返回带有makeUniqueLongId()的新id您的代码不创建唯一id,而只是随机创建的id。运行makeUniqueLongId()的频率越高,最终获得重复ID的可能性就越高 Django的un
如何防止id重复?
unique=True
是否不足以返回带有makeUniqueLongId()的新id
您的代码不创建唯一id,而只是随机创建的id。运行makeUniqueLongId()的频率越高,最终获得重复ID的可能性就越高
Django的unique=True将防止在条目的值已经存在时保存该条目,这正是出现错误的原因(请参阅文档)。此外,由于您正在设置primary_key=True,因此不需要使用unique,因为该条件将自动设置
尝试向模型中添加自定义save()方法:
def makeUniqueLongId():
return random.randint(100000000, 999999999)
class Project(models.Model):
id = models.BigIntegerField(primary_key=True, editable=False)
...
# while id is not yet set, create new random id. If random id not already exists, save as new id.
def save(self, *args, **kwargs):
while not self.id:
new_id = makeUniqueLongId()
if not type(self).objects.filter(id=new_id).exists():
self.id = new_id
super().save(*args, **kwargs)
我在
Project
模型下实现了save()
方法,但错误是:AttributeError:Manager无法通过项目实例访问。请检查在使用type(self).objects时它是否工作,因为无法从模型实例访问管理器。类型(self)将返回模型本身。更新了答案。
def makeUniqueLongId():
return random.randint(100000000, 999999999)
class Project(models.Model):
id = models.BigIntegerField(primary_key=True, editable=False)
...
# while id is not yet set, create new random id. If random id not already exists, save as new id.
def save(self, *args, **kwargs):
while not self.id:
new_id = makeUniqueLongId()
if not type(self).objects.filter(id=new_id).exists():
self.id = new_id
super().save(*args, **kwargs)