组合Django查询集的有效排序

2024-06-28 15:06:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用django实现一种非常复杂的排序查询集。它是更像是你的评论和你的朋友和家人的评论如何出现在facebook和youtube评论的顶部。你知道吗

为了分解,我将不同的查询集组合到同一个模型中以获得一个结果。你知道吗

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,这样做非常有效。你知道吗

有没有更有效的方法来实现这一点?你知道吗


Tags: totaskbyobjectsmy评论filterdict
2条回答

看起来你已经有了你想要的任务。根据获取任务后的处理方式,您可以使用itertools.chain按顺序返回它们。你知道吗

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

itertools.chain获取多个列表并将元素作为一个iterable生成。你知道吗

您可以使用以下选项:

from django.db.expressions import RawSQL

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

您可以添加多个注释并根据需要进行排序。RawSQL例如,如果需要按特定的用户id进行筛选,则注释可以接收参数。您可以使用SQL语句,如IFCASECOALESCE,为要用于排序的带注释列生成所需的值。你知道吗

这样你就可以实现两个目标:

  1. 结果将由数据库引擎过滤和排序(通常效率更高)
  2. 结果将是一个单独的DjangoQuerySet,无需将它们反序列化到字典中,它们将已经按正确的顺序排列

相关问题 更多 >