2010-05-26 2 views
2

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

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» и имеют имена и даты, как я хочу. Тем не менее, у меня есть класс для «Категории», это имя должно быть уникальным. Я предполагаю, что для меня должен быть относительно простой способ получить доступ к атрибуту name из Common и сделать его уникальным. Тем не менее, различные методы, которые я пытался использовать, все провалились. Например:

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

Вызывает страницу администратора Django плюнуть на ошибку «Caught исключение при визуализации:„Категория“объект не имеет„имя“атрибут

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

ответ

2

Нет, Django этого не допускает.

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

ответил также на другие вопросы, как: In Django - Model Inheritance - Does it allow you to override a parent model's attribute?

+0

Я немного потрясен, увидев, что в документах ... это кажется довольно большим упущением! – Joshmaker

+0

Ну, модель наследования полностью отсутствовала из Django в течение некоторого времени, поэтому я думаю, что это большое улучшение. Я не совсем уверен, но я думаю, что вы могли бы реализовать свой уникальный = true в пользовательском менеджере. Или вы можете использовать множественное наследование и иметь UNIQUE_NAME как mixin. – gomad

1

Вы небольшую ошибку в своем классе Common

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

должен быть

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

думаю, что это должна быть проблема с копированием и вставкой, так как это неверно. Python-self не определен в этой точке. –

+0

Извините за недоразумение по поводу опечатки. Поскольку я новичок в Python, я экспериментировал с большим количеством нечетного кода, чтобы увидеть, что происходит, и это был один из моих экспериментов, который я собирался очистить до вставки в Stackoverflow. К сожалению, мой код не работает, даже если опечатка удалена – Joshmaker

0

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

1

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

Смежные вопросы