2011-08-30 222 views
3

帮助!无法弄清楚这一点!即使使用默认参数集,get_or_create也会收到完整性错误。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。

回答

1

你不应该一般设置对象的id,你必须小心这样做。

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

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

SELECT SETVAL( 'tablename_id_seq',(SELECT MAX(ID)+ 1 FROM tablename_id_seq));

+0

仅当ID已存在时才设置ID。如果id为空,它将从数据库自动生成(自动增量)。至少这就是我所理解的。 – Kenneth

2

get_or_create()将尝试创建一个新的对象,如果不能找到一个,是一个准确匹配你传递参数。

那么究竟是什么我假设的情况是,一个不同的用户已经创建了一个ID为3020的对象。由于没有使用用户/ ID组合的对象,所以它会尝试使用该组合创建一个新对象,但会失败,因为不同的用户已经创建了一个物品ID为3020.

希望这是有道理的。看看下面的回报。可能会对已发生的事情有一点了解。

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

您可能需要在查找中生成3020个字符串。我假设一个字符串是从你的textJson.get()方法回来的。

+0

该对象存在于一个用户下。并发请求可能会进入吗? – Kenneth

+0

如果该对象已经存在,它将尝试创建另一个对象(使用不同的用户),但是您要分配的ID必须是唯一的。这就是你遇到错误的原因。与并发请求不应该有任何关系。 –