django 查询集计算字段中子字符串的出现次数

问题描述 投票:0回答:1

我有一个名为 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}

但它似乎计算条目数而不考虑子字符串。

django count django-queryset
1个回答
0
投票

我可以提供一个带有聚合的选项

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}
© www.soinside.com 2019 - 2024. All rights reserved.