Python 组合django查询集的有效排序

Python 组合django查询集的有效排序,python,django,Python,Django,我正在尝试使用django queryset实现一种非常复杂的排序,它更像是你的评论以及你的朋友和家人的评论出现在facebook和youtube评论的顶部 为了分解,我将不同的queryset组合到同一个模型中,以获得一个结果 my_assinged_tasks = Tasks.objects.filter(to=request.user) non_assigned_tasks = Tasks.objects.filter(to__isnull=True) tasks_created_by_m

我正在尝试使用django queryset实现一种非常复杂的排序,它更像是你的评论以及你的朋友和家人的评论出现在facebook和youtube评论的顶部

为了分解,我将不同的queryset组合到同一个模型中,以获得一个结果

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
任务=我的任务|未分配的任务|由我的直接主管创建的任务|建议的任务|未完成的任务|

I want to sort it in order of
1 - tasks_created_by_my_direct_supervisor
2 - my_assinged_tasks
3 - uncompleted_tasks
......
我脑海中唯一的解决方案是创建一个dict并逐个循环每个查询集结果,并相应地填充该dict,这样做非常有效


有没有更有效的方法来实现这一点?

看起来您已经拥有了所需的任务集。根据获取任务后的处理方式,您可以使用
itertools.chain
按顺序返回任务

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

获取多个列表并将元素作为一个iterable生成。

您可以使用以下选项:

from django.db.expressions import RawSQL

Task.objects.annotate(empty_to=RawSQL('to IS NULL', [])).order_by('empty_to')
您可以添加多个注释,并根据需要进行排序<例如,如果需要按特定用户id进行筛选,则code>RawSQLannotation可以接收参数。您可以使用SQL语句,如
IF
CASE
COALESCE
,为要用于排序的带注释列生成所需的值

这样,您将实现两个目标:

  • 结果将由数据库引擎进行过滤和排序(通常效率更高)
  • 结果将是一个Django
    QuerySet
    ,无需将它们反序列化到字典中,它们将已经按照正确的顺序排列
  • 可能重复的