Аннотируйте набор запросов с отфильтрованными связанными наборами запросов, которые также должны быть аннотированы

class A(models.Model):
    name = models.CharField()


class B(models.Model):
    name = models.CharField()


class C(models.Model):
    name = models.CharField()


class D(models.Model):
    a = models.ForeignKey(A, related_name='set_of_a')
    b = models.ForeignKey(B, related_name='set_of_d')
    set_of_c = models.ManyToManyField(C, related_name='set_of_d')

Я хочу получить кверисет, который должен заменить следующую функцию (в некоторых местах может быть псевдокодом):

def get_queryset(name, list_of_d):
    result = list(A.objects.filter(name__icontains=name))
    for a in result:
        a.map_b_to_list_of_d = {}  # annotation
        for b in B.objects.filter(set_of_d__set_of_c__intersects_with=set_of_c):
            a.map_b_to_list_of_d.setdefault(c, []) += list(b.set_of_d.filter(a__name__icontains=name, set_of_c__intersects_with=set_of_c))
    return result
Вернуться на верх