Допустим, если у меня есть модель, которая имеет много полей, но я забочусь только о 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}
, надеюсь, кто-нибудь увидит это редактирование ...
Видимо моей базы данных ( BigTable) не поддерживает агрегатные функции Джанго, и именно поэтому у меня были все проблемы.
Вы хотите что-то похожее на "количество... группировать по". Вы можете сделать это с помощью функций агрегации ORM django:
from django.db.models import Count
fieldname = 'myCharField'
MyModel.objects.values(fieldname)
.order_by(fieldname)
.annotate(the_count=Count(fieldname))
Предыдущие вопросы на эту тему:
Это называется агрегацией, и Django поддерживает ее напрямую.
Вы можете получить точный вывод, отфильтровав значения, которые вы хотите подсчитать, получив список значений и подсчитав их, и все это в одном наборе вызовов базы данных:
from django.db.models import Count
MyModel.objects.filter(myfield__in=('abc', 'xyz')).\
values('myfield').annotate(Count('myfield'))
Для этого можно использовать агрегацию 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)