Джанго сохранить, столбец указан дважды - PullRequest
1 голос
/ 16 мая 2010

Я хотел бы сохранить измененную модель, но я получаю ошибку программирования - поле указано дважды.

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 ]

2 голосов
/ 16 мая 2010

Я понятия не имею, почему вы определили свои модели таким образом, но я предполагаю, что вы работаете с устаревшей схемой базы данных или вы новичок в 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 голос
/ 26 августа 2014

Для тех, кто будет прибегать к помощи "ошибка, указанная в столбце дважды".

Может быть и другая причина этой ошибки. Посмотрите на этот код (из реального проекта):

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 (). И «code», и «name» даже получат собственный столбец в базе данных.

Но когда Django попытается сохранить модель такого типа, она вставит значение «код» дважды в запрос. Зачем? Потому что экземпляр поля является общим для двух полей. И я предполагаю, что в Django есть какой-то механизм, который каким-то образом использует экземпляр поля для разрешения имен полей для запроса.

Итак, SQL-запрос будет выглядеть так:

INSERT INTO mytable ("code", "code", ... all other fileds) .. values.
1 голос
/ 16 мая 2010

Я думаю, что источник проблемы в том, что у вас также есть поле с именем language_id, которое также создает столбец БД с именем language_id! Таким образом, у вас есть столкновение между label и language_id!

...