Как подсчитать одно поле в 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"))
)