Как сделать предварительную выборку или использовать select related в обратном родовом отношении в django?

Предположим, что у меня есть две модели:

class A:
  content_type = models.ForeignKey(ContentType, on_delete=models.PROTECT, null=True, blank=True)
  object_id = models.PositiveIntegerField(null=True, blank=True)
  attached_object = fields.GenericForeignKey('content_type', 'object_id')
class B:
  some_field = GenericRelation(class A)

Теперь у меня есть сценарий, в котором мне нужно перечислить все экземпляры класса B, и в этот список результатов мне нужно включить некоторые экземпляры класса A, которые связаны с классом B. При попытке сделать это, очевидно, это приводит к такому количеству запросов, сколько существует экземпляров класса B. Я просмотрел все форумы в Интернете, чтобы попытаться уменьшить количество запросов в этом случае.

instances_of_b = B.objects.all()
for instance in instances_of_b:
  some_list.append(instance.related_instance_of_class_A.some_field_of_class_A)

Чтобы получить related_instance_of_class_A, я использую ContentType.objects.get_for_model(content_object)

Есть ли способ использовать select_related/prefetch related в этом случае?

Не удалось найти точного решения с помощью select_related/ prefetch_related. Поскольку мой набор запросов для instances_of_class_b не очень большой, сократил запросы таким образом.

ids_of_instances_of_b = B.objects.values_list('id', flat=True)
related_instances_of_a = A.objects.filter(object_id__in=ids_of_instances_of_b)

Теперь, когда мне нужно перебрать экземпляры B, не нужно выполнять sql-запрос.

Вернуться на верх