Django保存,列指定两次

时间:2010-05-16 13:58:25

标签: django save foreign-keys

我想保存一个修改过的模型,但是我收到编程错误 - 指定了两次字段。

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。如果我将其删除,我的对象将被正确保存。

我不明白最新情况,因为我已经用这种方式定义了几乎所有的模型,我担心它完全错了,或者我只是误解了它...

有什么想法吗?

此致

3 个答案:

答案 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列!因此,labellanguage_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.