加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 为什么Django get_or_create导致这个IntegrityError

发布时间:2020-12-16 22:15:31 所属栏目:Python 来源:网络整理
导读:我有一个模型,上面有这个字段: token = models.CharField(max_length = 32,default =“”,unique = True,null = False,db_index = True) 在save()方法中,我使用此方法将此字段设置为32个字符的随机字符串: def save(self,*args,**kwargs): if (self.token

我有一个模型,上面有这个字段:
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 https://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()函数?答:是的

每当我第一次使用会话调用该方法时,我会得到一个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()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读