Проблема с наследованием модели и полиморфизмом - PullRequest
1 голос
/ 09 сентября 2010

Я пришел с новой проблемой Django. Ситуация: у меня есть класс модели UploadItemModel, я вызываю его для создания загружаемых элементов, таких как видео, аудио файлы ...

class UploadItem(UserEntryModel):
    category = 'abstract item'
    file = models.FileField(upload_to=get_upload_directory) 

Я подкласс это так:

class Video(UploadItem):
    category = 'video'

Мне нужно получить доступ к атрибутам категории из пользовательского тега. Проблема в том, что я получаю category = 'abstract item', даже если класс на самом деле Video.

Любая подсказка?

РЕДАКТИРОВАТЬ: мне нужно использовать иерархию, потому что у меня есть несколько типов элементов, которые пользователь может выложить (видео, аудио файлы, PDF текст). Мне нужно создать класс для каждого типа, но между этими классами есть много общего (например, формы).

Ответы [ 3 ]

1 голос
/ 09 сентября 2010

Вам нужно будет создать дополнительное поле, которое будет дескриптором для этого типа.

Здесь есть хороший учебник , объясняющий, как использовать наследование в моделях Django

1 голос
/ 09 сентября 2010

Любая подсказка?

Да.AFAIK это не работает так, как вы надеетесь.Модели Django не являются тривиальными классами Python.Они больше похожи на метаклассы, которые создают экземпляры своего рода «скрытого» определения класса.Да, ожидаемый класс моделей существует, но это не совсем то, что вы думаете.Во-первых, используемый вами класс был создан для вас из определения класса.Вот почему некоторые статические функции классов Python не работают так, как вы ожидаете в моделях Django.

Вы не можете использовать такие элементы уровня класса, как этот.хочу создать фактическое поле со значением по умолчанию или чем-то подобным.

class UploadItem(UserEntryModel):
    category = models.CharFIeld( default='abstract item' )
    file = models.FileField(upload_to=get_upload_directory) 

Даже после добавления комментариев к вопросу, мне все еще неясно, почему это делается.Кажется, нет никаких структурных или поведенческих различий.Все это похоже на один класс объектов.Подклассы, кажется, не определяют ничего нового.

Опции.

  1. Просто используйте имя класса вместо этого элемента категории на уровне класса.Сделайте имена классов достаточно хорошими, чтобы вам не понадобился этот элемент категории.

  2. Используйте свойство

    class UploadItem(UserEntryModel):
        file = models.FileField(upload_to=get_upload_directory) 
        @property
        def category( self ):
            return self.__class__.__name__
    
0 голосов
/ 09 сентября 2010

Можете ли вы попробовать переопределить метод __init__ класса для присвоения category каждому экземпляру?Например,

class Video(UploadItem):
    def __init__(self, *args, **kwargs):
        super(Video, self).__init__(*args, **kwargs)
        self.category = 'video'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...