Python 组合django查询集的有效排序
我正在尝试使用django queryset实现一种非常复杂的排序,它更像是你的评论以及你的朋友和家人的评论出现在facebook和youtube评论的顶部 为了分解,我将不同的queryset组合到同一个模型中,以获得一个结果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
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
,为要用于排序的带注释列生成所需的值
这样,您将实现两个目标:
QuerySet
,无需将它们反序列化到字典中,它们将已经按照正确的顺序排列