Django 查询按字符串值排序

Django Query Sort by Value of String

我有一个模型可以让我的客户为他的餐厅创建菜单。一切都很好,除了我想通过模型的字符串值设置显式排序。例如;他正在创建沙拉、意大利面、比萨等部分。但它们是按照添加到系统中的顺序通过模板显示的。如何向我的查询添加可以手动设置顺序的排序?以下是我当前的片段。

我正在使用 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'],
    }

您应该使用 order_by() 对查询集进行排序。例如,如果您的模型中有一个 name 属性,您只需将 .order_by("name") 添加到查询的末尾。

我认为 Django 查询集没有按字段值列表排序的机制。

选项 1:
在 Python 内订购。请记住,它会 return 一个列表,不再是一个查询集(受此 启发)并且您最终会使用魔术字符串(如果用户使用 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 sections (see how they order carousel item 创建一个 Menu 对象),但这对您来说有点过分,因为您似乎总是有 1 个订单。