django самый эффективный способ подсчета одинаковых значений полей в запросе

Допустим, если у меня есть модель, которая имеет много полей, но я забочусь только о charfield. Допустим, что charfield может быть чем угодно, поэтому я не знаю возможных значений, но я знаю, что значения часто перекрываются. Таким образом, у меня может быть 20 объектов с «abc» и 10 объектов с «xyz», или у меня может быть 50 объектов с «def» и 80 с «stu», и у меня 40000 без перекрытия, которые мне действительно безразличны.

Как эффективно считать объекты? Я хотел бы получить что-то вроде:

{'abc': 20, 'xyz': 10, 'other': 10,000}

или что-то в этом роде, без выполнения множества вызовов SQL.

РЕДАКТИРОВАТЬ:

Я не знаю, увидит ли это кто-нибудь, так как я немного редактирую это, но ...

У меня есть эта модель:

class Action(models.Model):
    author = models.CharField(max_length=255)
    purl = models.CharField(max_length=255, null=True)

и из ответов я сделал это:

groups = Action.objects.filter(author='James').values('purl').annotate(count=Count('purl'))

но ...

вот что такое группы:

{"purl": "waka"},{"purl": "waka"},{"purl": "waka"},{"purl": "waka"},{"purl": "mora"},{"purl": "mora"},{"purl": "mora"},{"purl": "mora"},{"purl": "mora"},{"purl": "lora"}

(я только что заполнил purl фиктивными значениями)

я хочу

{'waka': 4, 'mora': 5, 'lora': 1}

, надеюсь, кто-нибудь увидит это редактирование ...

РЕДАКТИРОВАТЬ 2:

Видимо моей базы данных ( BigTable) не поддерживает агрегатные функции Джанго, и именно поэтому у меня были все проблемы.

44
задан hynekcer 3 April 2019 в 14:43
поделиться

3 ответа

Вы хотите что-то похожее на "количество... группировать по". Вы можете сделать это с помощью функций агрегации ORM django:

from django.db.models import Count

fieldname = 'myCharField'
MyModel.objects.values(fieldname)
    .order_by(fieldname)
    .annotate(the_count=Count(fieldname))

Предыдущие вопросы на эту тему:

79
ответ дан 26 November 2019 в 21:53
поделиться

Это называется агрегацией, и Django поддерживает ее напрямую.

Вы можете получить точный вывод, отфильтровав значения, которые вы хотите подсчитать, получив список значений и подсчитав их, и все это в одном наборе вызовов базы данных:

from django.db.models import Count
MyModel.objects.filter(myfield__in=('abc', 'xyz')).\
        values('myfield').annotate(Count('myfield'))
16
ответ дан 26 November 2019 в 21:53
поделиться

Для этого можно использовать агрегацию Count Django для набора запросов. Примерно так:

from django.db.models import Count
queryset = MyModel.objects.all().annotate(count = Count('my_charfield'))
for each in queryset:
    print "%s: %s" % (each.my_charfield, each.count)
7
ответ дан 26 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: