在 Django 模型上执行 INNER JOIN、GROUP BY 和 COUNT

Posted

技术标签:

【中文标题】在 Django 模型上执行 INNER JOIN、GROUP BY 和 COUNT【英文标题】:Performing INNER JOIN, GROUP BY, and COUNT on Django models 【发布时间】:2012-06-15 22:03:33 【问题描述】:

我在理解如何使用 Django 模型进行复杂查询(甚至是简单查询)时遇到问题。我希望使用 django 模型在一个语句中进行内部连接、分组和计数。

例子:

Select ab.userid, count(ab.userid) as bids, u.username 
from auctionbids ab 
inner join users u on ab.userid=u.id 
group by ab.userid 
order by numbids desc;

这种类型的查询非常常见且直接,所以我不得不想象它可以用 django 模型完成,但从文档中看不出来。

编辑:添加模型

class Users(models.Model):
    id = models.IntegerField(primary_key=True)
    username = models.CharField(max_length=150)

class Auctionbids(models.Model):
    id = models.IntegerField(primary_key=True)
    user = models.ForeignKey(Users)

【问题讨论】:

【参考方案1】:

如果您发布您的 models.py 文件,我可能会给您一个更准确的答案,但我认为您想要的是 Django Aggregration API

你会像这样使用它:

from django.db.models import Count
User.objects.all().annotate(bids=Count('auctionbids')).order_by('bids')

【讨论】:

感谢您的回复。我认为 SQL 是不言自明的,所以我没有发布模型。我编辑了原件以包含更明确的模型。我会试试你的解决方案。 所以查询似乎工作(我得到了技术上好的数据)但是逻辑上接收到的数据是错误的。使用 SQL 语句,它首先选择竞价,然后选择内部连接。我似乎 django 查询正在选择所有用户,其中许多用户没有拍卖。实际上,Users.objects.all() 将拉动所有用户,这对数据库来说是一个重大打击。我想我需要使用过滤器而不是全部? 将过滤器添加到对象以删除用户的完整查询。最终结果:User.objects.filter(auctionbids__isnull=False).annotate(bids=Count('auctionbids')).order_by('-bids')

以上是关于在 Django 模型上执行 INNER JOIN、GROUP BY 和 COUNT的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有相同元素的两个 Python 列表上执行 MYSQL INNER JOIN?

来自INNER JOIN的Django SUM

sql inner join 与 left join和right join 执行效率上面有多大差别?

将 SQL Server 图形数据库中的 MATCH 子句和 INNER JOIN 与混合模型相结合

何时使用 LEFT JOIN 以及何时使用 INNER JOIN?

在 Oracle SQL Query 中加入(INNER JOIN)本地 Excel 表 - VBA