Умножение аннотаций с фильтрацией по отношениям "многие ко многим

У меня есть модели:

class Tag:
    name

class User:
    tags = M2M to Tag
    ...

class Bill:
    id
    tags = M2M to Tag
    ...


class BillRow:
    bill = FK to Bill, related_name='rows'
    quantity
    ...

А я хочу для пользователя отфильтровать счета по тегам и аннотировать с некоторыми агрегатами, например, Count of rows, Sum of quantity...

Bill.objects.filter(tags__in=user_tags).annotate(row_count=Count("rows"))

Проблема в том, что если у User и Bill больше общих тегов (у некоторого User U1 есть user_tags ['T1', 'T2', 'T3'], а у некоторого Bill B1 есть ['T2', 'T3', 'T4']), то результирующий запрос использует внутреннее объединение таблицы Tag для фильтра, и это дублирует в данном примере аннотацию row_count, потому что для каждой строки B1 есть 2 объединенных строки (для обоих общих тегов), которые удовлетворяют условию. Есть ли какое-то решение для такого типа аннотаций конкретно в Django ORM, но в более широком смысле, каким будет оптимальный подход в SQL для получения правильных результатов?

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