我查询一个模型:

Members.objects.all()

它返回:

Eric, Salesman, X-Shop
Freddie, Manager, X2-Shop
Teddy, Salesman, X2-Shop
Sean, Manager, X2-Shop

我想要的是知道Django最好的点火方式 对我的数据库进行group_by查询,如:

Members.objects.all().group_by('designation')

当然,这是行不通的。 我知道我们可以在django/db/models/query.py上做一些技巧,但我只是好奇如何不打补丁就能做到。


当前回答

出于某种原因,上面提到的解决方案并不适合我。这是有效的方法:

dupes_query = MyModel.objects.all().values('my_field').annotate(
    count=Count('id')
).order_by('-count').filter(count__gt=1)

我希望这能有所帮助。

其他回答

这有点复杂,但让提问者他/她期望只有一个DB命中。

from django.db.models import Subquery, OuterRef

member_qs = Members.objects.filter(
    pk__in = Members.objects.values('designation').distinct().annotate(
        pk = Subquery(
          Members.objects.filter(
            designation= OuterRef("designation")
        )
        .order_by("pk") # you can set other column, e.g. -pk, create_date...
        .values("pk")[:1]
        ) 
    )
   .values_list("pk", flat=True)
)

出于某种原因,上面提到的解决方案并不适合我。这是有效的方法:

dupes_query = MyModel.objects.all().values('my_field').annotate(
    count=Count('id')
).order_by('-count').filter(count__gt=1)

我希望这能有所帮助。

from django.db.models import Sum
Members.objects.annotate(total=Sum(designation))

首先你需要导入Sum 然后. .

你需要做自定义SQL的例子在这段代码:

自定义SQL通过子查询

或者在Django在线文档中所示的自定义管理器中:

添加额外的Manager方法

一个简单的解决方案,但不是正确的方法是使用原始SQL:

results = Members.objects.raw('SELECT * FROM myapp_members GROUP BY designation')

另一个解决方案是使用group_by属性:

query = Members.objects.all().query
query.group_by = ['designation']
results = QuerySet(query=query, model=Members)

现在可以遍历结果变量以检索结果。请注意,group_by没有文档,在Django的未来版本中可能会被更改。

和…为什么要使用group_by?如果不使用聚合,可以使用order_by来实现类似的结果。