[英]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.