gpt4 book ai didi

python - 为什么 Django get_or_create 会导致这个 IntegrityError?

转载 作者:太空狗 更新时间:2023-10-30 00:04:08 25 4
gpt4 key购买 nike

我有一个模型,上面有这个字段:
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:重复键值违反唯一约束“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com