我有一个模型,上面有这个字段:token = models.CharField(max_length=32, default="", unique=True, null=False, db_index=True)
在save()方法中,我使用以下方法将此字段设置为32个字符的随机字符串:
def save(self, *args, **kwargs):
if (self.token is None or len(self.token) == 0):
self.token = random_identifier()
super(SessionPassthrough, self).save(*args, **kwargs)
def random_identifier(n=32):
""" Generate a random identifier of length n.
From http://stackoverflow.com/questions/2257441/python-random-string-generation-with-upper-case-letters-and-digits"""
return ''.join(random.choice(string.ascii_lowercase + string.digits) for x in range(n))
但是,每当尝试创建模型的新实例时,我都会收到此错误:
IntegrityError: duplicate key value violates unique constraint "wakelytics_sessionpassthrough_token_key"
要创建实例,我调用此方法:
@staticmethod
def for_session(session):
sp, c = SessionPassthrough.objects.get_or_create(session=session)
return sp
在写入数据库之前,get_or_create()是否调用方法的save()函数? 回答:是
每当我第一次使用
session
调用该方法时,都会收到一个IntegrityError,并持续几分钟的错误。然后,它正确返回。是什么原因造成的? 最佳答案
是的。
https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create
从文档中:
将大致根据以下算法创建新对象:
defaults = kwargs.pop('defaults', {})
params = dict([(k, v) for k, v in kwargs.items() if '__' not in k])
params.update(defaults)
obj = self.model(**params)
obj.save()
关于python - 为什么Django get_or_create导致此IntegrityError?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6366333/