我有一个名为 Animal 的模型,其中包含一个名为
text
的字段,该字段以动物名称开头,后跟可选文本,例如猫 - 灰色长毛
class Animal:
text = models.TextField()
动物的一些例子包括:
animal1 = Animal()
animal1.text = "cat - grey long hair cat."
animal1.save()
animal2 = Animal()
animal2.text = "dog - black short hair dog."
animal2.save()
animal3 = Animal()
animal3.text = "non descriptive animal"
animal3.save()
我想计算以
text
、cat
或 dog
开头的 fish
的出现次数,并返回每个动物类别的计数。我认为这样的事情会起作用:
queryset = models.Animal.objects.all()
animal_summary = (
queryset
.annotate(
cats=Count(
Case(
When(text__startswith="cats", then=1),
default=0,
output_field=IntegerField(),
)
)
)
.annotate(
dogs=Count(
Case(
When(text__startswith="dogs", then=1),
default=0,
output_field=IntegerField(),
)
)
)
.annotate(
fish=Count(
Case(
When(text__startswith="fish", then=1),
default=0,
output_field=IntegerField(),
)
)
)
.values('cats', 'dogs', 'fish')
)
return {"animal_count": animal_summary}
但它似乎计算条目数而不考虑子字符串。
我可以提供一个带有聚合的选项:
from django.db.models import Count, Q
animal_summary = queryset.aggregate(
cat=Count('pk', filter=(Q(name__startswith='cat'))),
dog=Count('pk', filter=Q(name__startswith='dog')),
non=Count('pk', filter=Q(name__startswith='non')),
)
输入:
<QuerySet [<books: cat - grey long hair cat.>, <books: dog - black short hair dog.>, <books: non descriptive animal>, <books: cat>, <books: cat 33>]>
输出:
{'cat': 3, 'dog': 1, 'non': 1}