帮助!无法弄清楚这一点!即使使用默认参数设置,我也会在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。
答案 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这个特定索引,但是您首先需要以编程方式摆脱重复的行。