django - 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 响应中。
我究竟做错了什么?
解决方案
您似乎误解了关键字参数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'))
推荐阅读
- r - 如何根据 r 中的当前向量有效地更改数据帧中向量的值?
- reactjs - 如何在本机反应中从多值数组中获取特定键值
- unit-testing - 使用 doctests 对定义的类进行单元测试
- julia - 何时在基准表达式中进行插值
- selenium - WebdriverIO 测试不会针对 dockerized Selenium 服务器相应地运行
- reactjs - 如何确保包含在受保护路由中的所有路由也受到保护?
- matlab - 如何在脚本中使用 Dom::interval(x1,x2)?
- python - Deeplab v3+ 的可视化输出问题
- xml - 如何创建一个 complexType,其中元素可以按任何顺序排列,并且一个元素必须至少出现一次
- angular - Angular 6 http put 方法不更新数据