我有这个原始查询,我需要在Django&#39的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"
。
我该怎么做?
答案 0 :(得分:2)
您是否尝试过 F()表达式?
你可以这样使用它。
from django.db.models import F
queryset.annotate(final_name=F('selected_name'))
有关详细信息,请查看this。
不要忘记使用final_name(s)更改值。
答案 1 :(得分:1)
在此上下文中使用 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'))