Помогите новичку в Python с проблемой наследования модели Django - PullRequest
2 голосов
/ 26 мая 2010

Я работаю над своим первым настоящим проектом 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 выдавать сообщение об ошибке "Возникла исключительная ситуация при рендеринге: у объекта" Категория "нет атрибута" имя "

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

Ответы [ 4 ]

2 голосов
/ 26 мая 2010
1 голос
/ 27 мая 2010

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

1 голос
/ 26 мая 2010

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

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

должно быть

class Common(model.Model):
    name = models.CharField(max_length=255)
0 голосов
/ 26 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...