Можно ли в этом случае получить модель одним запросом?

Можно ли с помощью одного запроса или минимального количества запросов префетчить модели B к модели A. Я запутался. Спасибо.

from django.db import models

class ModelA(models.Model):
    pass


class ModelB(models.Model):
    pass


class ModelC(models.Model):
    model_a = models.ForeignKey(ModelA, related_name="models_a", on_delete=models.CASCADE)
    models_b = models.ManyToMany(ModelB, through="ModelD")


class ModelD(models.Model):
    model_c = models.ForeignKey(ModelC, on_delete=models.CASCADE)
    model_b = models.ForeignKey(ModelB, on_delete=models.CASCADE)

Я делаю что-то подобное, и это работает. Но выглядит немного уродливо.

models_a_list = ModelsA.objects.all()

model_d_qs = ModelD.objects.select_related("model_c", "model_b")

model_d_map = defaultdict(list)

for d_item in model_d_qs:
    model_d_map[d_item.model_c.model_a.id].append(d_item.model_b)

for a_item in models_a_list:
    settatr(a_item, "model_b_set", model_d_map.get(a_item.id))
return models_a_list
Вернуться на верх