Django QuerySet: дополнительное поле для подсчета появления значения - PullRequest
0 голосов
/ 03 июля 2018

У меня есть 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 ()

1 Ответ

0 голосов
/ 03 июля 2018

Вы можете использовать аннотацию так:

from django.db.models import Count
Tracker.objects.values('contract_number').annotate(contract_count=Count('contract_number')).order_by()
...