Python 正在为新记录创建自定义唯一Id,但存在重复错误

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并尝试插入一条记录,但出现重复错误

django.db.utils.IntegrityError:(1062,“1062(23000):重复条目 “715683160”用于关键“项目”\u project.PRIMARY“23000”)


如何防止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)