簡體   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