Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么Django get_或_create会导致此IntegrityError?_Python_Django_Orm_Model - Fatal编程技术网

Python 为什么Django get_或_create会导致此IntegrityError?

Python 为什么Django get_或_create会导致此IntegrityError?,python,django,orm,model,Python,Django,Orm,Model,我有一个模型上面有这个字段: 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 = rand

我有一个模型上面有这个字段:
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\u sessionpassthrough\u token\u key”

要创建实例,我调用此方法:

@staticmethod
def for_session(session):
    sp, c = SessionPassthrough.objects.get_or_create(session=session)
    return sp
get_或_create()在写入数据库之前是否调用该方法的save()函数回答:是

每当我第一次使用
会话调用该方法时,我会得到一个IntegrityError,并在几分钟内继续得到该错误。然后它会正确返回。这是什么原因造成的?

是的

从文档中:

新对象将大致按照以下算法创建:

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\u或\u create是否会简单地返回它?为什么要引发错误?因为
会话
不同,因此它是一个单独的行。