2008-11-22 6 views
2

Вот что я пытаюсь сделать, и не в ...Администратор общих встроенных строк для подклассов с несколькими таблицами - любые альтернативы?

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

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') 

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

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

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

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

ответ

0

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

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

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

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

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') 

Это мое предпочтение для обработки подклассовой модели.