Как получить из запроса только экземпляры базовой модели?

Надеюсь, мой вопрос не был задан раньше.

У меня есть следующие модели в моем приложении 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)
Вернуться на верх