Python Django查询按字符串值排序

Python Django查询按字符串值排序,python,django,django-models,wagtail,wagtail-snippet,Python,Django,Django Models,Wagtail,Wagtail Snippet,我有一个模型,允许我的客户为他的餐厅创建菜单。除了我想通过模型的字符串值来设置显式排序外,其他一切都很好。例如;他正在制作沙拉、意大利面、比萨饼等。。但它们是按照添加到系统中的顺序通过模板显示的。如何向查询中添加可以手动设置顺序的排序?下面是我当前的代码片段 我正在使用 Django 1.10.5、Wagtail 1.9、Python 3.5x 一小条 您应该使用对查询集进行排序。例如,如果模型中有name属性,则只需将.order\u byname添加到查询的末尾。您应该使用它对查询集进行排序

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

我正在使用 Django 1.10.5、Wagtail 1.9、Python 3.5x

一小条
您应该使用对查询集进行排序。例如,如果模型中有name属性,则只需将.order\u byname添加到查询的末尾。

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

我认为Django queryset没有一种按字段值列表排序的机制

备选案文1: Python中的顺序。请记住,它将返回一个列表,而不再是一个受此启发的查询集,并且您最终使用的是魔术字符串。如果用户使用Entrées而不是start怎么办

备选案文2: 在Section对象上添加一个menu\u order integer字段,并在此字段上添加order\u by。但这并不是最好的用户体验,因为您需要编辑每个部分来设置顺序,并且必须记住每个部分使用的数字

备选案文3:
在演示应用程序中创建一个带有部分的菜单对象,但这看起来有点过分了,因为似乎你永远都会有一个订单。

我认为Django queryset没有一种机制可以根据字段值列表进行排序

备选案文1: Python中的顺序。请记住,它将返回一个列表,而不再是一个受此启发的查询集,并且您最终使用的是魔术字符串。如果用户使用Entrées而不是start怎么办

备选案文2: 在Section对象上添加一个menu\u order integer字段,并在此字段上添加order\u by。但这并不是最好的用户体验,因为您需要编辑每个部分来设置顺序,并且必须记住每个部分使用的数字

备选案文3:
创建一个菜单对象,其中包含演示应用程序中的部分,但这看起来有点过分,因为您似乎总是有一个订单。

这只是按字母顺序排序;我需要像order_byname=[‘开胃菜’、‘沙拉’、‘甜点’……等等]这样的东西,它只是按照字母顺序来点菜;我需要像order_byname=['Starters'、'Salads'、'Desserts'……等]这样的东西,因为我的客户菜单部分是静态的,不可能更改,所以我添加了一个order字段,在model meta中进行了排序,然后打开数据库并手动添加了排序,而不是在modeladmin中使其可见。这使我能够以一种稍微有点黑客的方式订购部分,而不需要客户端处理。由于我的客户端菜单部分是静态的,不太可能更改,我添加了一个订单字段,在模型元中进行了排序,然后打开数据库并手动添加了排序,而不是在modeladmin中使其可见。这使我能够以一种稍微有点黑客的方式订购这些部分,而无需客户进行处理。
@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'],
    }
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))