2017-03-08 88 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 ...]) –