Как подсчитать одно поле в django queryset с несколькими group by?

Допустим, у меня есть набор запросов qs. Я группирую по набору кейсов следующим образом:

(
    qs.annotate(
        catering_price_enabled=F("outlet__library__settings__sligro_catering_price_enabled"),
    )
    .values("assortment_sync_id", "catering_price_enabled")
    .order_by("assortment_sync_id", "catering_price_enabled")
    .distinct("assortment_sync_id", "catering_price_enabled")
)

И я получаю что-то вроде:

<QuerySet [
   {'assortment_sync_id': '01234', 'catering_price_enabled': False}, 
   {'assortment_sync_id': '01234', 'catering_price_enabled': None}, 
   {'assortment_sync_id': '56789', 'catering_price_enabled': None},
]>

Я пытаюсь сделать annotate этот набор запросов, чтобы в конечном итоге я мог отфильтровать значения > 1. Другими словами, каждый assortment_sync_id может иметь только значение catering_price_enabled.

Если я добавляю .annotate(count=Count("assortment_sync_id")) django поднимает NotImplementedError: annotate() + distinct(fields) is not implemented. Я попробовал этот подход, потому что он очевидно работает только с одним полем.

Как я могу получить ожидаемый результат ниже?

<QuerySet [
   {'assortment_sync_id': '01234', 'catering_price_enabled': False, 'count': 2}, 
   {'assortment_sync_id': '01234', 'catering_price_enabled': None, 'count': 2}, 
   {'assortment_sync_id': '56789', 'catering_price_enabled': None, 'count': 1},
]>

"Я пытаюсь аннотировать этот набор запросов, чтобы в конечном итоге я мог отфильтровать значения > 1."

Если вы хотите получить объекты, у которых assortment_sync_id больше единицы:

qs.annotate(
catering_price_enabled=F("outlet__library__settings__sligro_catering_price_enabled"),)
.values("assortment_sync_id", "catering_price_enabled")
.order_by("assortment_sync_id", "catering_price_enabled")
.distinct("assortment_sync_id", "catering_price_enabled")

qs.filter(assortment_sync_id__gte=1)

Вы можете отказаться от queryset.distinct(), поскольку группа уже позаботилась об этом. Тогда подсчет аннотаций будет работать как ожидалось.

(
    qs.annotate(
        catering_price_enabled=F("outlet__library__settings__sligro_catering_price_enabled"),
    )
    .values("assortment_sync_id", "catering_price_enabled")
    .order_by("assortment_sync_id", "catering_price_enabled")
    .annotate(count=models.Count("assortment_sync_id"))
)
Вернуться на верх