代码之家  ›  专栏  ›  技术社区  ›  Ankita Gupta

将原始SQL查询转换为具有多个联接的Django ORM

  •  0
  • Ankita Gupta  · 技术社区  · 7 年前

    我需要在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" .

    我该怎么做?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Davit Tovmasyan    7 年前

    你试过了吗 F()表达式 ?

    你可以这样使用它。

    from django.db.models import F
    
    queryset.annotate(final_name=F('selected_name'))
    

    this .

    不要忘记用final\u名称更改值。

        2
  •  1
  •   MarcinEl    6 年前

    使用 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'))