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

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

4 ответа

Решение

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

См. Документы: http://docs.djangoproject.com/en/1.1/topics/db/models/

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

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

У вас есть небольшая ошибка в вашем Common учебный класс

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

должно быть

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

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

Другие вопросы по тегам