Общие встроенные админские черты для подклассовых моделей с несколькими таблицами не работают --- есть ли альтернативы? - PullRequest
2 голосов
/ 22 ноября 2008

Вот что я пытаюсь сделать, и мне не удается ...

У меня есть файловая модель, которая имеет родовое отношение к другим объектам:

class File(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()
    file = models.FileField(upload_to='files/%Y/%m/%d')
    # etc....

Я также хочу иметь подкласс File, чтобы иметь дело с конкретным случаем изображений, которые будут отображаться на странице, а не загружаться:

class Image(File):
    file = models.ImageField(upload_to='files/%Y/%m/%d')

Все вышеперечисленное работает нормально, в том числе общие строки модели File, пока я не захочу использовать generic-inline модели Image - процесс сохранения не может создать экземпляр базового класса и, таким образом, выдает ошибку, заявляющую что Image.file_ptr («секретный» внешний ключ базового класса) не может быть None.

Таким образом, в основном, встроенные строки не поддерживают должным образом наследование нескольких таблиц.

Вполне вероятно, что я делаю это более сложным, чем нужно, поэтому кто-нибудь может предложить или решение этой проблемы, или лучший способ достижения той же цели?

Пожалуйста, дайте мне знать, если вам нужны дальнейшие разъяснения.

1 Ответ

0 голосов
/ 22 ноября 2008

Наследование может быть реализовано двумя способами в реляционной модели.

Подклассом может быть новая таблица со всеми теми же столбцами, что и повторяемый суперкласс. Это хорошо работает, когда у вас есть абстрактные функции суперкласса или подкласса, которые переопределяют суперкласс.

Подкласс может быть просто уникальными столбцами с объединением таблицы суперкласса. Это хорошо работает, когда у вас есть конкретный суперкласс.

В вашем случае, похоже, у вас может быть следующее.

class FileFacts( models.Model ):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

class DownloadFile( models.Model ):
    facts = models.ForeignKey( FileFacts )
    file = models.FileField(upload_to='files/%Y/%m/%d')

class InlineImage( models.Model ):
    facts = models.ForeignKey( FileFacts )
    file = models.ImageField(upload_to='files/%Y/%m/%d')

Это мое предпочтение для работы с моделью, подобной подклассу.

...