7

我有一个名为“StoreItem”的模型和一个名为“QuoteItem”的模型。一个 QuoteItem 指向一个 StoreItem。

我正在尝试注释有多少报价项目指向商店项目的计数器,但条件适用于报价项目。

我试过这样的事情:

items = items.annotate(
            quote_count=Count(
                Case(
                    When(quoteitem__lookup_date__in=this_week, then=1), 
                    output_field=IntegerField()
                )
            )
        )

'items' 是 StoreItems 的查询集。'this_week' 是代表本周的日期列表(这是我尝试应用的过滤器)。在我使日期工作正常后,我想为这个条件计数添加更多过滤器,但让我们从它开始。

无论如何,我得到的更像是一个布尔值 - 如果存在符合条件的报价项目,无论我有多少,计数器将为 1。否则,将为 0。

它看起来是Count(Case())唯一检查是否存在任何项目,如果存在则返回 1,而我希望它遍历指向商店项目的所有报价项目并计算它们,如果它们符合条件(单独)。

我该如何实现?

4

2 回答 2

14

您需要将所有内容都包装在一个Sum语句中,而不是Count(我觉得这有点奇怪Count):

from django.db.models import Case, IntegerField, Sum, When

items = items.annotate(
        quote_count=Sum(
            Case(
                When(quoteitem__lookup_date__in=this_week, then=1), 
                output_field=IntegerField()
            )
        )
    )

这基本上将内部语句的所有0s 和s 相加,从而计算匹配数。1Case

于 2016-06-29T03:55:15.133 回答
0

我正在做类似的任务。对我来说,由于我加入了多少张桌子, Sumover无法正常工作(计数过多)。Case/When结局是这样的:

from django.db.models import Case, IntegerField, Count, When, F

items = items.annotate(
        quote_count=Count(
            Case(
                When(quoteitem__lookup_date__in=this_week, then=F('quoteitem__id'), 
            ),
            distinct=True,
        )
    )

就我而言,我实际上必须将两个Counts 加在一起,例如:

items = items.annotate(
        quote_count=Count(
            Case(
                When(quoteitem__lookup_date__in=this_week, then=F('quoteitem__id'), 
            ),
            distinct=True,
        )
    ) + Count (
            Case(
                When(itemgroup__lookup_date__in=this_week, then=F('itemgroup__quoteitem__id'), 
            ),
            distinct=True,
        )

假设items可以quoteitems通过anitemgroup或直接相关。

于 2017-11-28T15:12:17.333 回答