ValueError с наследованием мультитаблицы в Django Admin

Я создал два новых класса, которые наследовали модель Entry:

class Entry(models.Model):
    LANGUAGE_CHOICES = settings.LANGUAGES

    language = models.CharField(max_length=2, verbose_name=_('Comment language'), choices=LANGUAGE_CHOICES)
    user = models.ForeignKey(User)
    country = models.ForeignKey(Country, null=True, blank=True)

    created = models.DateTimeField(auto_now=True)

class Comment(Entry):
    comment = models.CharField(max_length=2000, blank=True, verbose_name=_('Comment in English'))

class Discount(Entry):
    discount = models.CharField(max_length=2000, blank=True, verbose_name=_('Comment in English'))
    coupon = models.CharField(max_length=2000, blank=True, verbose_name=_('Coupon code if needed'))

После добавления этих новых моделей администратору через admin.site.register я получаю ValueError при попытке создать комментарий или скидку через администратора. Добавление записей хорошо работает.

Сообщение об ошибке:

ValueError в/admin/reviews/discount/add/не Может присвоиться "''": "Discount.discount" должен быть "Дисконтным" экземпляром. Метод запроса: ПОЛУЧИТЕ URL Запроса: Тип исключительной ситуации http://127.0.0.1:8000/admin/reviews/discount/add/: Значение Исключения ValueError:
Не может присвоиться "''": "Discount.discount" должен быть "Дисконтным" экземпляром. Расположение исключительной ситуации:/Library/Python/2.6/site-packages/django/db/models/fields/related.py в наборе, строка 211 Исполняемых файлов Python:/usr/bin/python Версия Python: 2.6.1

5
задан Georg Fritzsche 20 May 2010 в 22:57
поделиться

2 ответа

Причина появления этой ошибки заключалась в том, что я использовал то же имя столбца, которое уже использовалось с названием модели. Карен Т. предоставила следующий ответ в список рассылки Django :

Проблема, похоже, в том, что вы назвали поле в своей модели комментариев с тем же именем , только нижний регистр. Комментарий наследуется от Entry с использованием многотабличного наследования. Это добавляет OneToOneField в комментарии обратно к записи , что имеет побочный эффект добавления атрибута "комментарий" к записи. Это атрибут который позволяет вам получить доступ к комментарию, связанному с записью , как результат OneToOneField в комментарии, и по умолчанию ему дается имя { {1}} родственная модель, все строчные буквы.

Проблема возникает тогда, когда модель комментария "наследует" все поля / атрибуты записи: унаследованный атрибут "комментарий" от { {1}} Запись явно перекрывает указанное поле комментария . Вероятно, это ошибка, но похоже, что существует с 1.0. Я не {{ 1}} провел какое-либо исследование, чтобы узнать, сообщалось ли об этом.

В качестве обходного пути вы можете назвать свои поля чем-нибудь, кроме , название модели должно быть в нижнем регистре, или вы может явно указать OneToOneField в дочерних моделях, указав parent_link = True и что-то кроме названия модели все в нижнем регистре для related_name .

6
ответ дан 14 December 2019 в 13:28
поделиться

Ханч говорит, что вы могли бы объявить свой класс Entry абстрактным, если только вам не нужен Entry как реальный объект

...rest of Entry model here...
created = models.DateTimeField(auto_now_add=True) ## ONLY set date when created, not every save

class Meta:
   abstract = True

...methods for your model etc...
0
ответ дан 14 December 2019 в 13:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: