Как сделать предварительную выборку или использовать 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-запрос.