首页 > 解决方案 > Django "Join" 和 "count" - 在 psql 中很简单,在 Django 中不是那么简单

问题描述

用户 ID 8a0615d2-b123-4714-b76e-a9607a518979在表中有许多条目mylog。每个都有一个ip_id字段。我想查看这些ip_id字段的加权列表。

在我使用的 sql 中:

select distinct(ip_id), count(ip_id) from mylog
where user_id = '8a0615d2-b123-4714-b76e-a9607a518979'
group by ip_id

这让我:

ip_id                                  count
--------------------------------------+--------
84285515-0855-41f4-91fb-bcae6bf840a2  | 187
fc212052-71e3-4489-86ff-eb71b73c54d9  | 102
687ab635-1ec9-4c0a-acf1-3a20d0550b7f  | 84
26d76a90-df12-4fb7-8f9e-a5f9af933706  | 18
389a4ae4-1822-40d2-a4cb-ab4880df6444  | 10
b5438f47-0f3a-428b-acc4-1eb9eae13c9e  | 3

现在我试图在 django 中得到相同的结果。这是令人惊讶的难以捉摸。

获取用户:

u = User.objects.get(id='8a0615d2-b123-4714-b76e-a9607a518979') #this works fine.

我试过:

logs = MyLog.objects.filter(Q(user=u) & Q(ip__isnull=False)).values('ip').annotate(total=Count('ip', distinct=True))

我得到了 6 行,logs这很好,但count始终是6,而不是唯一 ip 的权重,因为它在上面的 SQL 响应中。

我究竟做错了什么?

标签: djangodjango-models

解决方案


您似乎误解了关键字参数distinct在函数中的Count作用。它只是意味着您只想计算不同的值(您实际上不想这样做)。事实上,您的 SQL 查询distinct(ip_id)中的部分也是多余的group by,因为无论如何您都将使用该子句。

此外,您写.value('ip')的是一个错字,应该是.values('ip').

所以你的 ORM 查询应该是:

logs = MyLog.objects.filter(Q(user=u) & Q(ip__isnull=False)).values('ip').annotate(total=Count('ip'))

推荐阅读