【问题标题】:Django annotate with conditional expression, how to apply distinct()Django 使用条件表达式进行注释,如何应用 distinct()
【发布时间】:2018-07-24 23:30:02
【问题描述】:

我的查询有点复杂,我使用带条件表达式的注释,代码如下:

from django.db.models import Q, F, When, CharField, Value, Case
from django.contrib.auth.models import User


ATT_PREFIX = 'f'

def get_it(mymodel, fields):

    q = Q(modelone__modeltwo__mymodel=mymodel)

    query_set = {
        'aid': F('modelone__id'),
        'name': F('modelfour__name'),
    }

    for f in fields:
        query_set[ATT_PREFIX + str(f.id)] = Case(
            When(Q(modelfive__modelsix=f) &
                 Q(modelfive__user__email=F('email')),
                 then='modelfive__entry'),
            default=Value(''),
            output_field=CharField(),
        )

    return User.objects.filter(q).annotate(**query_set)

使用F() 收集的属性aid 和name 具有预期值。使用条件表达式的第二部分有一个问题:如果 feilds 列表包含 2 个对象,那么当满足条件时,我有 2 个由 Case() 创建的用户对象。因此,我得到了两个对象,而不是一个具有 (aid, name, f17, f18) 属性的对象:

obj1 attributes (aid, name, f17)
obj2 attributes (aid, name, f18)

Django 1.10、Python3.5

【问题讨论】:

    标签: django django-views django-queryset django-annotate


    【解决方案1】:

    试试这个

    q = Q(modelone__modeltwo__mymodel=mymodel).distinct()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 2015-09-22
      • 2018-05-13
      • 2020-07-27
      • 2021-03-04
      • 2010-09-19
      • 2018-06-13
      相关资源
      最近更新 更多