Django Model Inheritance запрашивает центральную таблицу - PullRequest
2 голосов
/ 20 апреля 2011

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

class LessonModule(models.Model):
    lesson = models.ForeignKey('Lesson')
    name = models.CharField(max_length=100, blank=True)


class ProfileImage(LessonModule):
    file_loc = models.ImageField(upload_to="profiles/")
    detail_file_loc = models.ImageField(upload_to="profiles/", blank=True)

    def render(self):
        t = loader.get_template("template/profile_image.html")
        c = Context({'image_path': self.file_loc.url})
        return t.render(c)

    def __unicode__(self):
        return '[prof: %d]' % self.id

class Note(LessonModule):
    def __unicode__(self):
        return '[note: %d]' % self.id

    def render(self):
        return self.id

То, что я хотел бы сделать, это сделать:

module = LessonModule.objects.get(pk=20)
module.render()

И он должен запустить соответствующую функцию рендеринга. Например, если pk совпадает с моделью Note, он просто возвращает self.id. Конечно, это упрощается тем, что я хочу сделать с этими функциями.

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

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

1 Ответ

2 голосов
/ 26 октября 2011

Я не использовал его, но этот проект выглядит так, как вы ищете:
https://code.google.com/p/django-polymorphic-models/

Вы можете запросить LessonModule.objects.all (), а затем .downcast ()каждый объект автоматически добавляется в ProfileImage или Note.

Или добавьте PolymorphicMetaclass в свой LessonModule, чтобы всегда получать объекты ProfileImage и Note из набора запросов.

Обратите внимание на стоимость дополнительных запросов ... полиморфизмв моделях Django это делается с помощью объединения таблиц, а не чистого кода Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...