Мне нужен другой метод, чтобы получить все ExtEntryrelated для одной конкретной категории
Easy:
ExtEntry.objects.filter(categories=my_category)
Знаете ли вы, если есть способ использовать функцию _set унаследованного
Я не знаю, есть ли у них прямые для этого. Это не упомянуто в документации.
Но с помощью select_related
.
можно получить аналогичные результаты.
for e in category.entry_set.select_related('extentry'):
e.extentry # already loaded because of `select_related`,
# however might be None if there is no Extentry for current e
Можно выбрать только те записи, которые имеют ExtEntry:
for e in category.entry_set.select_related('extentry').exlude(extentry=None):
e.extentry # now this definitely is something, not None
Недостаток исключения состоит в том, что он генерирует ужасно неэффективный запрос:
SELECT entry.*, extentry.* FROM entry
LEFT OUTER JOIN `extentry` ON (entry.id = extentry.entry_ptr_id)
WHERE NOT (entry.id IN (SELECT U0.id FROM entry U0 LEFT OUTER JOIN
extentry U1 ON (U0.id = U1.entry_ptr_id)
WHERE U1.entry_ptr_id IS NULL))
Таким образом, мое резюме будет: используйте ExtEntry.objects.filter()
, чтобы получить ваши результаты. Отношения в обратном направлении (object.something_set) - это просто удобство и работает не во всех ситуациях.