Django查询按字符串的值排序

时间:2017-03-08 21:56:01

标签: python django django-models wagtail wagtail-snippet

我有一个模型,允许我的客户为他的餐厅创建菜单。一切都很好,除了我想通过模型的字符串值设置显式排序。例如;他正在创建像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'],
    }

2 个答案:

答案 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")