Django get_or_create使用默认值引发密钥Primary的重复条目

时间:2011-08-30 15:47:38

标签: python mysql django

帮助!无法弄清楚这一点!即使使用默认参数设置,我也会在get_or_create上收到完整性错误。

这是模型看起来如何被剥离。

class Example(models.Model):model
    user            = models.ForeignKey(User)
    text            = models.TextField()

def __unicode__(self):
    return "Example"

我在Django中运行它:

def create_example_model(user, textJson):
    defaults = {text: textJson.get("text", "undefined")}

    model, created = models.Example.objects.get_or_create(
            user=user, 
            id=textJson.get("id", None), 
            defaults=defaults)

    if not created:
        model.text = textJson.get("text", "undefined")
        model.save()

    return model

我在get_or_create行上收到错误:

IntegrityError: (1062, "Duplicate entry '3020' for key 'PRIMARY'")

现场直播,所以我无法确切地知道输入是什么。

帮助?实际上有一个默认设置,所以它不是,这个问题,他们没有默认值。此外,它没有在一起 - 独特。 Django : get_or_create Raises duplicate entry with together_unique

我正在使用python 2.6和mysql。

3 个答案:

答案 0 :(得分:2)

get_or_create()会尝试创建一个新对象,如果找不到与您传入的参数完全匹配的对象。

我假设正在发生的事情是,不同的用户创建了一个ID为3020的对象。由于没有带有您要求的用户/ id组合的对象,它会尝试创建一个新对象使用该组合,但失败,因为另一个用户已经创建了一个ID为3020的项目。

希望这是有道理的。看看以下内容返回。可能会对已经发生的事情有所了解。

models.Example.objects.get(id=3020)

您可能需要在查找中将3020作为字符串。我假设字符串是从textJson.get()方法返回的。

答案 1 :(得分:1)

一般情况下,你不应该为对象设置id,在这样做时你必须要小心。

您是否检查过要放入数据库的'id'值?

如果这不能解决您的问题,那么它可能是一个数据库问题,对于PostgreSQL,有一个特殊的序列用于递增ID,有时这不会增加。如下所示:

  

SELECT setval('tablename_id_seq',(SELECT MAX(id)+ 1 FROM   tablename_id_seq));

答案 2 :(得分:0)

get_or_create()失败的一个常见原因,但文献记载很少,是损坏的数据库索引。

Django取决于一个假设,即给定标识符只有一条记录,而这又通过对数据库中该特定字段使用UNIQUE索引来强制执行。但是索引不断被重写,它们可能会损坏,例如database crashes unexpectedly。在这种情况下,索引可能不再返回有关现有记录的信息,而是添加了具有相同字段的另一条记录,因此,每次尝试获取或创建此特定记录时,您都会点击IntegrityError

至少在PostgreSQL中,解决方案是REINDEX这个特定索引,但是您首先需要以编程方式摆脱重复的行。