为什么Django get_or_create会导致此IntegrityError?
我有上有此领域的典范:token = models.CharField(max_length=32, default="", unique=True, null=False, db_index=True)
为什么Django get_or_create会导致此IntegrityError?
在我使用此方法将该字段设置为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://*.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()
当然它中。其合同的一部分是它将返回一个模型,确实存在,并为此做它必须保存。
编辑:
你得到错误,因为该值已经存在于数据库中。
如果它已经存在,那么get_or_create是否会简单地返回它?为什么提出错误? – 2011-06-16 05:53:57
因为'session'是不同的,所以它是一个单独的行。 – 2011-06-16 05:55:50
你*知道即使是一个随机程序也可以选择一个已经存在的值...对吗? – 2011-06-16 02:28:31
我知道。但每一次?然后它停止抛出一个错误? – 2011-06-16 03:09:31
这是随机的。你不知道*什么时候会选择一个不在数据库中的值。 – 2011-06-16 03:12:05