Подтвердить что ты не робот

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

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

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

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

или что-то в этом роде, без тонны вызовов SQL.

EDIT:

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

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

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"}

(я просто заполнил пурпурными фиктивными значениями)

я хочу

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

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

ИЗМЕНИТЬ 2:

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

4b9b3361

Ответ 1

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

from django.db.models import Count

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

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

Ответ 2

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

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

from django.db.models import Count
MyModel.objects.filter(myfield__in=('abc', 'xyz')).\
        values('myfield').annotate(Count('myfield'))

Ответ 3

Вы можете использовать Django Count aggregation для выполнения запроса. Что-то вроде этого:

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)