Python 将原始SQL查询转换为具有多个联接的Django ORM
我需要在Django的ORM中重写这个原始查询:Python 将原始SQL查询转换为具有多个联接的Django ORM,python,mysql,django,django-orm,Python,Mysql,Django,Django Orm,我需要在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.leve
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
输出有“userlevel\uuu current\u sub-level\u id\uu level\u id”
和“userlevel\uu current\u sub-level\u id\uu level\u name”
列。我需要将它们别名为“level\u id”
和“level\u name”
我该怎么做呢?你试过F()表达式吗
你可以这样使用它
from django.db.models import F
queryset.annotate(final_name=F('selected_name'))
有关更多信息,请查看
不要忘了更改带有最终名称的值。您尝试过F()表达式吗
你可以这样使用它
from django.db.models import F
queryset.annotate(final_name=F('selected_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'))
在这种情况下,使用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'))
我在annotate中使用F()对象编写了查询,这将返回所需的键“level\u id”和“level\u name”以及“userlevel\u current\u sub\u level\u id\u level\u id”和“userlevel\u current\u sub\u level\u id\u level\u name”。也没有办法避免这两个长键吗?@AnkitaGupta是的,只需将它们从值中删除即可。>>打印(User.objects.annotate(User\u name=F('username')).values('User\u name')[0])>{'User\u name':'davit'}这没有帮助,因为我需要在级别\u id和名称上应用分组。如果我在annotate()之后移动.values(),分组就不会发生。我在annotate中用F()对象编写了查询,这将返回所需的键“level\u id”和“level\u name”以及“userlevel\u current\u sub\u level\u id\u level\u id”和“userlevel\u current\u sub\u level\u id\u level\u name”。也没有办法避免这两个长键吗?@AnkitaGupta是的,只需将它们从值中删除即可。>>打印(User.objects.annotate(User\u name=F('username')).values('User\u name')[0])>{'User\u name':'davit'}这没有帮助,因为我需要在级别\u id和名称上应用分组。如果在annotate()之后移动.values(),则不会进行分组