Помогите новичку в 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
заставить его в свой собственный уникальный индекс. В противном случае, вероятно, проще всего создать два отдельных абстрактных класса, один с уникальным полем, а другой - нет.