2017-03-08 121 views
0

我有一個模型,允許我的客戶爲他的餐廳創建菜單。除了我希望通過模型的字符串值設置顯式排序外,一切都很好。例如;他正在創建一些部分,如沙拉,意大利麪食,比薩餅等等,但他們通過添加到系統中的順序通過模板顯示。我如何添加一個排序到我的查詢,我可以手動設置訂單?以下是我目前的片段。Django查詢按字符串值排序

我使用 的Django 1.10.5,鶺鴒1.9,Python的3.5倍

片段

@register.inclusion_tag('tags/_lunch-menu-list.html', takes_context=True) 
def lunch_products(context): 
    sections = Section.objects.all().prefetch_related('product').filter(product__lunch_menu=True).distinct() 
    return { 
     'sections': sections, 
     'request': context['request'], 
    } 

回答

0

我不認爲Django的查詢集有一個機制來按字段值列表排序。

選項1:
Python中的順序。務請注意它會返回一個列表,而不是一個查詢集了(從這個answer啓發),以及你最終使用魔法字符串(如哪些用戶使用的Entrées代替Starters?):

sections = Section.objects.all() 
order = ['Starters', 'Salads', 'Desserts'] 
order = {key: i for i, key in enumerate(order)} 
ordered_sections = sorted(sections, key=lambda section: order.get(section.name, 0)) 

選項2:
Section對象上添加menu_order整數字段,在此字段上添加order_by。這不是最好的用戶體驗,因爲您需要編輯每個部分來設置順序,並且必須記住您爲每個部分使用了哪個數字。

方案3:
創建orderable部分(見演示程序how they order carousel item)一個Menu對象,但是這看起來有點矯枉過正,你因爲它似乎你將永遠永遠有1級。

+0

由於我的客戶菜單部分是靜態的並且不太可能改變,我添加了一個訂單字段,在模型中進行了排序,然後打開數據庫並手動添加排序,而不是在modeladmin中顯示。這使我可以在客戶不必處理它的情況下以稍微黑客的方式訂購這些部分。 –

0

您應該使用order_by()來查詢集進行排序。例如,如果您的模型中有name屬性,則只需將.order_by("name")添加到查詢的末尾即可。

+1

這就是按字母順序order_by();我需要類似order_by(name = ['Starters','Salads','Desserts'..... etc ...]) –