Django二级注释查询不同的表

时间:2015-08-17 17:08:06

标签: python mysql django

我有这个问题:

queryset = MyModel.objects.filter(flag=False)\
.annotate(task_count=Count('task'))\
.filter(task__disabled=True)\
.annotate(tasks=DistinctConcat('task__name', separator=';'))\
.values('id', 'task_count', 'tasks')

我希望获得类似的内容:

{
    'id': u'0bac989c-1396-11e5-83ed-0242aa110587',
    'tasks': u'task1;task20;task23',
    'task_count': 35
}

其中task_count为35,因为它计算与MyModel.id="0bac989c-1396-11e5-83ed-0242aa110587"相关的每项任务,tasks显示disabled任务列表(disabled是一个字段task模型)。

相反,通过我的查询,我在tasks中获得了一个列表,其中包含所有35个任务的完整列表。

我首先开始:

queryset = MyModel.objects.filter(flag=False, task__disabled=True)
.annotate(task_count=Count('task'), tasks=DistinctConcat('task_name', separator=';'))
.values('id', 'task_count', 'tasks')

哪个不起作用,因为它得到:

{
    'id': u'0bac989c-1396-11e5-83ed-0242aa110587',
    'tasks': u'task1;task20;task23',
    'task_count': 3
}

在那里,task_count正在计算查询中的当前列表,我不想要,因为我想要disabled个任务的列表,但所有相关的完整计数0bac989c-1396-11e5-83ed-0242aa110587上的任务。

请帮忙

顺便说一句,我使用的GroupConcat是:

class SQLDistinctConcat(SQLAggregate):
    sql_function = 'group_concat'

    @property
    def sql_template(self):
        separator = self.extra.get('separator')
        if separator:
            return '%(function)s(DISTINCT %(field)s separator "%(separator)s")'
        else:
            return '%(function)s(DISTINCT %(field)s)'


class DistinctConcat(Aggregate):
    def add_to_query(self, query, alias, col, source, is_summary):
        aggregate = SQLDistinctConcat(
            col, source=source, is_summary=is_summary, **self.extra)
        query.aggregates[alias] = aggregate

0 个答案:

没有答案