【问题标题】:Annotating on a distinct Django Queryset is no longer using the distinct queryset注释不同的 Django 查询集不再使用不同的查询集
【发布时间】:2022-01-23 07:26:55
【问题描述】:

我有一个查询,我正在尝试注释字段 tail_tip 的每个值的计数。我的原始查询过滤了相关表,因此有必要使用 distinct()。 我不完全确定如何描述,但是当我注释不同的查询时,查询不再不同。这是我在 shell 中使用的查询。

// Without distinct()
Ski.objects.filter(published=True, size__size__in=[178, 179, 180, 181, 182, 183, 184]).count()
// 318

skis = Ski.objects.filter(published=True, size__size__in=[178, 179, 180, 181, 182, 183, 184]).distinct()
skis.count()   
// 297

skis.values('tail_tip').order_by('tail_tip').annotate(count=Count('tail_tip'))
// <QuerySet [{'tail_tip': 'flat', 'count': 99}, {'tail_tip': 'full_twin', 'count': 44}, {'tail_tip': 'partial_twin', 'count': 175}]>
// total count = 318

鉴于skis 已经是distinct() 我不知道为什么当我对其进行注释时,总计数等于非明确查询。

【问题讨论】:

    标签: python django django-queryset django-annotate


    【解决方案1】:

    尝试添加distinct=True

    skis.values('tail_tip').order_by('tail_tip').annotate(count=Count('tail_tip', distinct=True))
    

    【讨论】:

    • &lt;QuerySet [{'tail_tip': 'flat', 'count': 1}, {'tail_tip': 'full_twin', 'count': 1}, {'tail_tip': 'partial_twin', 'count': 1}]&gt; 中添加不同的结果
    【解决方案2】:

    假设名为SizeSki 的相关表具有一对多的关系。这可以通过这种方式完成:

    ski_filtered = Ski.objects.filter(
        published=True, 
        id__in=Size.objects.values("skis__id").filter(  # Maybe somethig else than `skis` here, you didn't show its model, so I couldn't know
            size__in=[178, 179, 180, 181, 182, 183, 184]
        )
    )
    
    skis.values('tail_tip').distinct().order_by('tail_tip').annotate(count=Count('tail_tip'))
    

    为什么会这样:DISTINCT 不能与 annotate() 一起使用。在 django 中实现 annotate() 是用它自己的 GROUP BY 子句实现的。所以在已经 GROUP BY-ed 的查询上应用 distinct() 是行不通的。

    【讨论】:

    • 这很有效,感谢您的解释!
    猜你喜欢
    • 2019-11-01
    • 2021-05-10
    • 2012-01-04
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2019-12-30
    相关资源
    最近更新 更多