我想保存一个修改过的模型,但是我收到编程错误 - 指定了两次字段。
class ProductInfo(models.Model):
product_info_id = models.AutoField(primary_key=True)
language_id = models.IntegerField()
product_id = models.IntegerField()
description = models.TextField(blank=True)
status = models.IntegerField()
model = models.CharField(max_length=255, blank=True)
label = models.ForeignKey(Category_info, verbose_name = 'Category_info', db_column = 'language_id', to_field = 'node_id', null = True)
我收到此错误,因为外键用作db_column language_id。如果我将其删除,我的对象将被正确保存。
我不明白最新情况,因为我已经用这种方式定义了几乎所有的模型,我担心它完全错了,或者我只是误解了它...
有什么想法吗?
此致
答案 0 :(得分:2)
我不知道为什么你这样定义了你的模型,但我假设你正在使用遗留数据库模式,或者你是django的新手。
上面的代码尝试生成两个名为language_id
的列。 Django不会让你这样做,因为每个字段都需要控制自己的数据库列。我不确定你要通过让两个字段指向同一个数据库列来实现的目标。
如果你是django的新手并且这是一个新的数据库,那么看起来你做错了。也许您正在寻找以下模型定义:
class ProductInfo(models.Model):
language = models.ForeignKey(Language)
product = models.ForeignKey(Product)
description = models.TextField(default="", blank=True)
status = models.IntegerField(choices=STATUS_CHOICES)
model = models.CharField(max_length=255, default="", blank=True)
label = models.ForeignKey(CategoryInfo, null = True)
答案 1 :(得分:1)
我认为问题的来源是你还有一个名为language_id
的字段,它也创建了一个名为language_id
的db列!因此,label
和language_id
之间发生了冲突!
答案 2 :(得分:1)
对于那些将谷歌搜索“指定两次列”的错误..
此错误可能还有其他原因。看看这段代码(来自真实项目):
class Language(models.Model):
code = name = models.CharField(max_length=10, null=False, default="", blank=False, choices=ALL_LANGUAGES)
name_on_site = models.CharField(max_length=250, null=False, default="", blank=False)
locale_code = models.CharField(max_length=10, null=True, default="", blank=True)
enabled = models.BooleanField(default=False)
def __unicode__(self):
return '%s (%s)' % (self.name_on_site, self.code)
一见钟情,不是吗?
code = name =
看到这个错字?它将导致创建两个字段,每个字段都是合法的CharField()。 “代码”和“名称”都会在数据库中获得自己的列。
但是,当Django尝试保存这种模型时,它会在查询中插入两次“code”值。为什么?因为Field实例在两个字段之间共享。我猜Django中有一些机制,它以某种方式使用Field实例来解析查询的字段名称。
因此,sql查询将如下所示:
INSERT INTO mytable ("code", "code", ... all other fileds) .. values.