ValueError с наследованием нескольких таблиц в Django Admin - PullRequest
5 голосов
/ 15 мая 2010

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

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" должен быть экземпляром "Discount",Метод запроса: GET URL запроса: http://127.0.0.1:8000/admin/reviews/discount/add/ Тип исключения: ValueError Значение исключения:
Невозможно назначить "''": "Discount.discount" должен быть экземпляром "Discount".Расположение исключения: /Library/Python/2.6/site-packages/django/db/models/fields/related.py в set , строка 211 Исполняемый файл Python: / usr / bin / python Версия Python: 2.6.1

Ответы [ 2 ]

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

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

Проблема, кажется, в том, что у вас есть назвал поле в вашей модели комментариев с тем же именем, только нижний регистр. Комментарий наследуется от Entry, используя мульти-таблица наследование. Это добавляет OneToOneField в комментариях назад к Вступление, которое имеет побочный эффект добавив атрибут «комментарий» в Entry. Это атрибут, который позволяет вам получить доступ к комментарию, связанному с Вступление в результате OneToOneField в комментариях и по умолчанию ему дается имя родственная модель, строчная.

The проблема возникает, когда комментарий модель "наследует" все поля / атрибуты Entry: унаследованный атрибут 'comment' от Вступление, очевидно, перекрывает указанное поле для комментариев. Это возможно ошибка, но, похоже, был там с 1.0. я не сделал любое исследование, чтобы увидеть, если это было сообщили.

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

0 голосов
/ 15 мая 2010

Ганч говорит, что вы можете сделать объявление класса 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...
...