我有这个问题:
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