Я создал два новых класса, которые наследовали модель 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
Причина появления этой ошибки заключалась в том, что я использовал то же имя столбца, которое уже использовалось с названием модели. Карен Т. предоставила следующий ответ в список рассылки Django :
Проблема, похоже, в том, что вы назвали поле в своей модели комментариев с тем же именем , только нижний регистр. Комментарий наследуется от Entry с использованием многотабличного наследования. Это добавляет OneToOneField в комментарии обратно к записи , что имеет побочный эффект добавления атрибута "комментарий" к записи. Это атрибут который позволяет вам получить доступ к комментарию, связанному с записью , как результат OneToOneField в комментарии, и по умолчанию ему дается имя { {1}} родственная модель, все строчные буквы.
Проблема возникает тогда, когда модель комментария "наследует" все поля / атрибуты записи: унаследованный атрибут "комментарий" от { {1}} Запись явно перекрывает указанное поле комментария . Вероятно, это ошибка, но похоже, что существует с 1.0. Я не {{ 1}} провел какое-либо исследование, чтобы узнать, сообщалось ли об этом.
В качестве обходного пути вы можете назвать свои поля чем-нибудь, кроме , название модели должно быть в нижнем регистре, или вы может явно указать OneToOneField в дочерних моделях, указав parent_link = True и что-то кроме названия модели все в нижнем регистре для related_name .
Ханч говорит, что вы могли бы объявить свой класс 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...