我有一个模型,允许我的客户为他的餐厅创建菜单。一切都很好,除了我想通过模型的字符串值设置显式排序。例如;他正在创建像Salads,Pastas,Pizzas等部分。但是它们会按照添加到系统中的顺序通过模板显示。如何在查询中添加排序,我可以手动设置订单?以下是我目前的片段。
我正在使用 Django 1.10.5,Wagtail 1.9,Python 3.5x
@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 :(得分:2)
我认为Django queryset没有一种按字段值列表排序的机制。
选项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:
在menu_order
对象上添加Section
整数字段,在此字段上添加order_by
。这不是最好的用户体验,因为您需要编辑每个部分来设置顺序,并且必须记住您为每个部分使用的数字。
选项3:
使用orderable部分创建一个Menu
对象(请参阅演示应用中的how they order carousel item),但这看起来有点矫枉过正,因为看起来你总是会有1个订单。
答案 1 :(得分:0)
您应该使用order_by()对查询集进行排序。例如,如果您的模型中有name
属性,则只需在查询末尾添加.order_by("name")
。