ValueError с многозабором наследования в Django Admin
-
27-09-2019 - |
Вопрос
Я создал два новых класса, которые наследуют модель входа:
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 Я получаю ValuctionError при попытке создать комментарий или скидку через Admin. Добавление записей работает нормально.
Ошибка msg:
ValueError at / admin / examents / discount / add / не может назначить "''": «Скидка. Discount» должна быть экземпляром «скидка». Способ запроса: получить URL-адрес запроса: http://127.0.0.1:8000/admin/reviews/discount/add/Тип исключения: Значение исключения ValueError:
Не удается назначить «''»: «Скидка. Discount» должна быть экземпляром «скидки». Расположение исключения: /library/python/2.6/site-packages/django/db/models/fields/related.py в задавать, Линия 2111 исполняемость Python: / usr / bin / python python версия: 2.6.1
Решение
Причина этой ошибки появилась, потому что я использовал то же имя столбца, которое уже использовалось с именем модели. Карен Т. внесил следующий ответ в Список рассылки Django:
Проблема, кажется, что вы назвали поле в модели вашего комментария с тем же именем, только нижний регистр. Комментарий наследует от входа, используя многосторонние наследования. Это добавляет OneToonefield в комментарии обратно к записи, который имеет побочный эффект добавления атрибута «комментария» к записи. Это атрибут, который позволяет получить доступ к комментарию, связанному с записью в результате OneToonefield в комментарии, и по умолчанию предоставляется название соответствующей модели, все строчные.
Проблема возникает, когда модель комментариев «наследует» все поля / атрибуты записи: атрибут унаследованного «комментария» из записи, по-видимому, перезагружается на указанный поле комментариев. Это, вероятно, ошибка, но, похоже, было там с 1.0. Я не сделал никаких исследований, чтобы увидеть, сообщается ли это.
В качестве обходного пути вы можете назвать свои поля что-то, кроме имени модели, все ниже, или вы можете явно указать OneToonefield в дочерних моделях, указав parent_link = true и что-то другое, кроме имени модели, все ниже для знакомства.
Другие советы
SOWCH говорит, что вы можете сделать с объявлением вашего класса входа в качестве абстрактного, если вам тоже не нужен запись как фактический объект,
...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...