ОП здесь.
Хотя ответ second
является правильным для вопроса, я хотел бы добавить, что я считаю, что наследование нескольких таблиц является неэффективным подходом для этого сценария. Доступ к атрибуту модели подкласса вызовет выполнение запроса, что потребует запроса для каждой возвращаемой строки. Уч. Насколько я могу судить, select_related
пока не работает для многостолового наследования.
Я также исключил ContentTypes, потому что он не будет делать это достаточно элегантно и, похоже, потребует много запросов.
Я остановился на использовании абстрактного класса:
class Section (models.Model):
title = models.CharField(max_length=80)
order = models.IntegerField()
class Meta:
abstract=True
ordering=['order']
Запрашивает обе таблицы:
section_clickables = SectionClickable.objects.filter(video=video)
section_headings= SectionHeading.objects.filter(video=video)
и объединил два набора запросов
#Join querysets /323162/kak-obedinit-2-ili-bolee-naborov-zaprosov-v-predstavlenii-django
s = sorted(chain(section_headings, section_clickables), key=attrgetter('order'))
Наконец, я сделал тег шаблона для проверки экземпляра:
from my.models import SectionHeading, SectionClickable
@register.filter()
def is_instance(obj, c):
try:
return isinstance(obj, eval(c))
except:
raise ObjectDoesNotExist('Class supplied to is_instance could not be found. Import it in the template tag file.')
чтобы в моем шаблоне ( HamlPy ) я мог сделать это:
- if s|is_instance:"SectionClickable"
%span {{s.title}}
- if s|is_instance:"SectionHeading"
%span{'style':'color: #{{s.color}};'}
{{s.title}}
В результате я использовал только два запроса: один для получения SectionClickable
объектов и один для SectionHeading
объектов