1

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

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

2 回答 2

4

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

选项 1:
在 Python 中订购。请记住,它将返回一个列表,而不是一个查询集(受此答案的启发)并且您最终使用魔术字符串(如果用户使用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整数字段。这不是最好的用户体验,因为您需要编辑每个部分以设置顺序,并且必须记住您为每个部分使用的数字。Sectionorder_by

选项 3:
创建一个带有可订购Menu部分的对象(查看他们如何在演示应用程序中订购轮播项目),但这对您来说似乎有点过分,因为您似乎总是有 1 个订单。

于 2017-03-08T23:59:13.517 回答
0

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

于 2017-03-08T22:28:44.423 回答