代码之家  ›  专栏  ›  技术社区  ›  Juraj Bezručka

django不同于queryset值的queryset

  •  1
  • Juraj Bezručka  · 技术社区  · 7 年前

    我有一个 User Account s、 可能有多个 Unit 在每个 我建立了一个过滤字典并得到了相关的单位:

    units = Unit.objects.filter(**unit_filter)
    

    user_dicts = units.values('account__user').distinct()
    

    或者更确切地说:

    user_ids = [rec.get('account__user') for rec in 
                units.values('account__user').distinct()]
    

    所以我可以使用 User.objects.filter(id__in=user_ids)

    我不确定,但我在评估 id in 在我看来效率不高。有没有更好的方法从过滤单元中获取唯一用户?


    编辑:

    我添加了SQL查询(没有对它们进行测试,可能是错误的)来显示我在Django ORM中要做的事情。实际上我想用 JOIN WHERE 条款。

    WITH selected_units AS
      (SELECT id, account_id FROM units)
    SELECT DISTINCT u.id FROM user u 
      JOIN account a on a.user_id=u.id
      JOIN unit ut ON ut.account=a.id 
      JOIN selected_units s ON s.id=ut.id;
    

    但是 id_in

    WITH selected_units AS
      (SELECT id, account_id FROM units)
    SELECT DISTINCT u.id FROM user u 
      JOIN account a on a.user_id=u.id 
      JOIN unit ut ON ut.account_id=a.id 
    WHERE ut.id IN (SELECT id FROM selected_units);
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Gediminas    7 年前

    User.objects.filter(account__unit__in=units)
    

    或者不那么漂亮:

    User.objects.filter(id__in=units.values_list('account__user__id', flat=True))