2017-05-08 45 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排序,無需他們反序列化他們將已經在正確的順序
相關問題