Django用条件表达式注释,如何应用distinct()

时间:2018-02-14 11:42:50

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

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

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()收集的属性辅助和名称具有预期值。使用条件表达式的第二部分有一个问题:如果feilds列表包含2个对象,那么当条件满足时,我有Case()创建的2个User对象。因此,我没有一个带有属性(aid, name, f17, f18)的对象,而是有两个对象:

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

Django 1.10,Python3.5

0 个答案:

没有答案