【问题标题】:Django QuerySet "row based" aggregationDjango QuerySet“基于行”聚合
【发布时间】:2013-06-02 00:55:09
【问题描述】:

我有一个模型 Foo,它与模型 Bar 和模型 Baz 有 m2m 关系,所以它看起来有点像这样:

Bar(0..*)----(1..*)Foo(1..*)----(0..*)Baz

我要做的是通过关联的 Bars 和 Bazs 的总和来获得前 n 个 Foos。

这是我目前得到的:

Foo.objects.all() \
    .annotate(count_bar=(Count('bar')) \
    .annotate(count_baz=(Count('baz').extra(
        'select'={'total' : 'count_bar + count_baz'},
        'order_by'=('-total',)
    )

extra 调用之前,QuerySet 看起来不错。然后我得到Unable to get repr for QuerySet
如果F() 可以在annotate 调用中使用,这将是一件轻而易举的事。有什么 ORM 友好的方式可以解决这个问题吗?

【问题讨论】:

    标签: django-models django-queryset django-orm


    【解决方案1】:

    检索所有带有计数的 Foo,并使用 lambda 作为键使用 sorted 对它们进行排序。

    【讨论】:

    • “正确”的解决方案可能是让 Bar 和 Baz 成为同一个超类的子类,并使用 Foo m2m。
    猜你喜欢
    • 1970-01-01
    • 2017-10-08
    • 2018-10-09
    • 2019-03-25
    • 1970-01-01
    • 2023-01-12
    • 2015-02-16
    • 1970-01-01
    • 2020-07-02
    相关资源
    最近更新 更多