Как получить из запроса только экземпляры базовой модели?
Надеюсь, мой вопрос не был задан раньше.
У меня есть следующие модели в моем приложении Django:
from django.db import models
class A(models.Model):
some_attribute = models.SomeField()
def some_method(self):
do_stuff()
# Note: not abstract
class B(A):
def some_other_method(self):
do_other_stuff()
Теперь, если у меня есть один A
и один B
в базе данных,
когда я делаю вызов A.objects.filter()
, я получаю A
и также B
экземпляр (как и ожидалось).
Но что если на самом деле мне нужны только экземпляры A
?
Я не понимаю, как записать это как инструкцию .exclude()
.
Может быть, фильтрация с помощью type == "A"
является подходящим способом?
Вы можете фильтровать с помощью:
A.objects.filter(b=None)
для получения A
объектов, для которых не существует B
экземпляра. Это сделает LEFT OUTER JOIN
на модели B
, и таким образом сохранит только те объекты, для которых B
есть NULL
.
Или вы можете опустить все подклассы A
с:
data = {
f.name: None
for f in A._meta.get_fields()
if f.one_to_one and A in f.related_model.__mro__
}
A.objects.filter(**data)