У меня есть поле модели, которое содержит варианты:
db_redirection_choices = (('A', 'first'), ('B', 'second'))
redirection_type = models.CharField(max_length=256, choices=db_redirection_choices, blank=True, null=True)
В какой-то момент я выполняю группировку по этому столбцу, считая все существующие варианты:
results = stats.values('redirection_type').annotate(amount=Count('redirection_type')).order_by('redirection_type')
Однако это даст мне результаты только для существующих вариантов. Хочу добавить в results те, которых даже нет с 0
например Если таблица содержит только запись
Id | redirection_type
--------------------------
1 | 'A'
тогда annotate вернет только
'A': 1
конечно, это нормально, но я все равно хотел бы получить все несуществующие варианты в результатах:
{'A': 1, 'B': 0}
Как проще всего этого добиться?





Я не думаю, что есть простой способ сделать это с помощью ORM, за исключением, возможно, использования условное выражение, но я думаю, что это значительно усложнит ваш запрос.
Почему бы не выполнить простую постобработку на Python?
db_redirection_choices = (('A', 'first'), ('B', 'second'))
# I think your queryset will have a similar shape
results = [{'redirection_type': 'A', 'amount': 1}]
results_map = {
**{choice: 0 for choice, _display in db_redirection_choices},
**{res['redirection_type']: res['amount'] for res in results}
}
assert results_map == {'A': 1, 'B': 0}
Если вам не нужна дальнейшая обработка в ORM, это кажется самым простым.