Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将原始SQL查询转换为具有多个联接的Django ORM_Python_Mysql_Django_Django Orm - Fatal编程技术网

Python 将原始SQL查询转换为具有多个联接的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

我需要在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
输出有
“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(),则不会进行分组