1

想象一下,我只想知道Django 的auth app中具有相同first_name的用户数量。我知道如何在 SQL 中非常容易地做到这一点:

SELECT first_name, COUNT(1) as num_users 
  FROM auth_user 
  GROUP BY first_name
  ORDER BY num_users DESC;

而且我还知道如何在 Django 中获得所需的输出(例如,像浏览所有用户,获取他们的电子邮件并进行过滤计数)。

难道没有更简单的方法可以通过 Django 的 ORM 做到这一点吗?如果我使用外键而不是表字段之一进行聚合,我可以完成它。我很确定我错过了一些东西。

谢谢。

4

3 回答 3

1

Django 的注释允许您将一些基本计算附加到查询集中的每个对象(或整个查询集中的聚合),但您不能过滤这些注释(即,在您的情况下,您只想计算那些共享您的名字的用户)

Django 还F() objects允许您在查询中使用字段值。理想情况下,您可以将这些与注释结合使用来过滤您要注释的对象,但目前还不可能(正在修复)

因此,一个简单的解决方案是手动执行注释:

users = User.objects.all().extra(select={
    'same_name_count' : """
    SELECT COUNT(*)
    FROM auth_user
    WHERE auth_user.first_name = user.first_name
    """
})
于 2012-12-03T23:17:27.010 回答
1

几年前,我在博客上讨论过这个问题。与其他答案相反,在 Django 中完全有可能,不需要原始 SQL。

于 2012-12-03T23:23:27.763 回答
0

检查这个:https ://docs.djangoproject.com/en/dev/topics/db/aggregation/

from django.db.models import Count
auth_user.objects.annotate(num_users=Count('first_name'))

对于更复杂的查询,您可以使用普通 SQL,但尽量避免使用它。

UPD代码已修复。感谢 Timmy O'Mahony 的提及!

于 2012-12-03T23:05:09.007 回答