У меня есть QuerySet
объект с 100 предметами, для каждого из которых мне нужно знать, сколько раз конкретное contract_number
встречается в поле contract_number
.
Пример ожидаемого результата:
[{'contract_number': 123, 'contract_count': 2}, {'contract_number': 456, 'contract_count': 1} ...]
Это означает, что значение 123 встречается 2 раза для всего поля contract_number
.
Важная вещь: я не могу уменьшить количество предметов, поэтому группировка здесь не работает.
Эквивалентом SQL для этого будет дополнительное поле contract_count
, как показано ниже:
SELECT *,
(SELECT count(contract_number) FROM table where t.contract_number = contract_number) as contract_count
FROM table as t
Вопрос в том, как это сделать с помощью объекта Python. После некоторых исследований я обнаружил, что для более сложных запросов следует использовать дополнительный метод Queryset . Ниже приведена одна из моих попыток, но результат не тот, который я ожидал
queryset = Tracker.objects.extra(
select={
'contract_count': '''
SELECT COUNT(*)
FROM table
WHERE contract_number = %s
'''
},select_params=(F('contract_number'),),)
Мой models.py
:
class Tracker(models.Model):
contract_number = models.IntegerField()
EDIT:
Решением моей проблемы было Subquery ()