Помогите новичку в Python с проблемой наследования модели Django

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

class Common(model.Model):
    name = models.CharField(max_length=255)
    date_created  = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.name

    class Meta:
        abstract=True

Все идет нормально. Теперь все другие мои модели расширяют «Общие» и имеют имена и даты, как я хочу. Однако у меня есть класс для «Категорий», где имя должно быть уникальным. Я предполагаю, что у меня должен быть относительно простой способ получить доступ к атрибуту имени из Common и сделать его уникальным. Однако все различные методы, которые я пытался использовать, потерпели неудачу. Например:

class Category(Common):
    def __init__(self, *args, **kwargs):
        self.name.unique=True

Заставляет страницу администрирования Django выдавать ошибку «Обнаружено исключение при рендеринге: объект« Категория »не имеет атрибута« имя »

Может ли кто-нибудь указать мне в правильном направлении?


person Joshmaker    schedule 26.05.2010    source источник


Ответы (4)


Нет, Джанго не позволяет этого.

См. документы: http://docs.djangoproject.com/en/1.1/topics/db/models/#field-name-hiding-is-not-permitted

Также ответил на другие вопросы, такие как: at">В Django - Наследование модели - Позволяет ли вам переопределить атрибут родительской модели?

person gomad    schedule 26.05.2010
comment
Я немного шокирован, увидев это в документах... это кажется довольно большим упущением! - person Joshmaker; 26.05.2010
comment
Что ж, в Django какое-то время полностью отсутствовало наследование моделей, так что я думаю, что это большое улучшение. Я не совсем уверен, но я думаю, что вы могли бы реализовать свой уникальный=true в пользовательском менеджере. Или вы можете использовать множественное наследование и использовать UNIQUE_NAME в качестве примеси. - person gomad; 26.05.2010

У вас небольшая ошибка в вашем Common классе

class Common(model.Model):
    self.name = models.CharField(max_length=255) 

должно быть

class Common(model.Model):
    name = models.CharField(max_length=255)
person Mark Lavin    schedule 26.05.2010
comment
думаю, что это должно быть проблемой копирования и вставки, поскольку это недействительно Python - self не определено в этот момент. - person Daniel Roseman; 26.05.2010
comment
Извините за путаницу из-за опечатки. Поскольку я новичок в Python, я экспериментировал с большим количеством странного кода, просто чтобы посмотреть, что произойдет, и это был один из моих экспериментов, который я хотел очистить перед вставкой в ​​Stackoverflow. К сожалению, мой код не работает даже после удаления опечатки - person Joshmaker; 26.05.2010

Обратите внимание, что ограничение UNIQUE на самом деле не имеет ничего общего с Django, поэтому вы можете добавить его в свою таблицу базы данных. Вы также можете использовать хук post-syncdb для этой цели. .

person Tomasz Zieliński    schedule 26.05.2010

Попробуйте использовать Meta.unique_together, чтобы принудительно ввести его в собственный уникальный индекс. В противном случае проще всего создать два отдельных абстрактных класса, один с уникальным полем, а другой нет.

person Ignacio Vazquez-Abrams    schedule 26.05.2010