2017-05-08 43 views
0

我想要使用django queryset.Its来实现非常复杂的排序,更像是您的评论以及您的朋友和家人评论如何在Facebook和YouTube上发表评论。对组合Django查询集进行高效排序

要崩溃,我将不同的查询集合到相同的模型实现结果。

my_assinged_tasks = Tasks.objects.filter(to=request.user) 
non_assigned_tasks = Tasks.objects.filter(to__isnull=True) 
tasks_created_by_my_direct_supervisor = Tasks.objects.filter(**criteria) 
suggested_todo_task = ##Some Complex Logic to detect what task are similar to my completed tasks 
uncompleted_tasks = ## Criteria 

tasks = my_assinged_tasks | non_assigned_tasks | tasks_created_by_my_direct_supervisor | suggested_todo_task | uncompleted_tasks

I want to sort it in order of 
1 - tasks_created_by_my_direct_supervisor 
2 - my_assinged_tasks 
3 - uncompleted_tasks 
...... 

我在我的脑海中唯一的解决办法是单独通过创建每个查询结果集的字典和循环并填充字典因此这是非常高效的方式。

有没有更高效的方法来实现这一目标?

+1

可能重复显示对象从不同的模型在同一页根据他们的发布日期(http://stackoverflow.com/questions/37747427/display-对象从 - 不同-models-在最相同的页面,根据对他们的-敬上) – e4c5

回答

0

它看起来像你已经在你想要的集合中的任务。根据您在获取它们后处理任务的方式,也许您可​​以使用itertools.chain按顺序返回它们。

tasks = itertools.chain(
    tasks_created_by_my_direct_supervisor, 
    my_assinged_tasks, 
    uncompleted_tasks, 
    ... 
) 

itertools.chain需要多个列表,并产生所述元素作为一个单一迭代。

0

您可以使用以下方法:

from django.db.expressions import RawSQL 

Task.objects.annotate(empty_to=RawSQL('to IS NULL', [])).order_by('empty_to') 

您可以添加多个注释和排序它们如你所愿。例如,如果您需要按特定用户标识进行过滤,则可以使用RawSQL注释来接收参数。您可以使用SQL语句(例如IF,CASE,COALESCE)为将用于排序的注释列生成期望值。

这种方式,你会实现两个目标:

  1. 结果将过滤,通过数据库引擎(通常更有效)
  2. 结果将是一个单一的Django QuerySet排序,无需他们反序列化他们将已经在正确的顺序
相关问题