繁体   English   中英

通过多个联接将原始SQL查询转换为Django ORM

[英]Convert raw SQL query to Django ORM with multiple joins

我有这个原始查询,需要在Django的ORM中重写:

SELECT count(u.username) as user_count, l.id as level_id, l.name as level_name
FROM users u
JOIN user_levels ul ON ul.username = u.username
JOIN sub_levels sl ON sl.id = ul.current_sub_level_id
JOIN levels l ON l.id = sl.level_id
WHERE u.created_at::DATE >= '2018-01-01' AND u.created_at::DATE <= '2018-01-17' AND u.type = 'u'
GROUP BY l.id, l.name

到目前为止,我已经能够以这种方式编写它:

Users.objects.select_related('user_levels', 'sub_levels', 'levels')
.filter(created_at__date__gte='2018-01-01', created_at__date__lte='2018-01-17', type='u')
.values('userlevel__current_sub_level_id__level_id', 'userlevel__current_sub_level_id__level__name')
.annotate(user_count=Count('username'))

输出具有"userlevel__current_sub_level_id__level_id""userlevel__current_sub_level_id__level__name"列。 我需要将它们别名为"level_id""level_name"

我怎样才能做到这一点?

您是否尝试过F()表达式

您可以通过这种方式使用它。

from django.db.models import F

queryset.annotate(final_name=F('selected_name'))

有关更多信息,请检查

别忘了用final_name更改值。

在这种情况下,使用F()表达式是合适的。 尝试这个:

from django.db.models import F

Users.objects.select_related('user_levels', 'sub_levels', 'levels')
.filter(created_at__date__gte='2018-01-01', created_at__date__lte='2018-01-17', type='u')
.annotate(level_id=F('userlevel__current_sub_level_id__level_id'), level_name=F('userlevel__current_sub_level_id__level__name'))
.values('level_id', 'level_name')
.annotate(user_count=Count('username'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM