【问题标题】:How to query list while preserving order如何在保留订单的同时查询列表
【发布时间】:2016-09-05 21:00:42
【问题描述】:

我想根据列表进行查询。我知道我可以做到:

lists = [Everton, Liverpool, Villa]
queryset = Betting.objects.filter(matches__in=list)

但是,这不会按顺序查询表。正在执行的操作基于fuzzywuzzy,并且查询按列表顺序完成是至关重要的

我已经看到了这个解决方案django-create-a-queryset-from-a-list-preserving-order.html,但它似乎不适用于 sqllite

谢谢..任何帮助将不胜感激

【问题讨论】:

  • 按列表顺序查询的ORM表..即..它首先检查列表[0],列表[1],其余的按它们在列表中的显示顺序跨度>
  • 您能具体说明您要查找的确切顺序吗?
  • 你真的需要一个查询集吗?如果没有,您可以在查询后进行 python 排序。
  • 是的,我需要一个查询集,以便能够获取其他字段属性..例如 book.date 或 book.author..为此我需要一个查询集
  • 顺便说一句,原始 SQL 始终是这种卡住的解决方案

标签: python django django-models django-orm


【解决方案1】:

试试这样的:

from django.db.models import Case, Value, When, IntegerField

cases = [When(matches=x, then=Value(i)) for i,x in enumerate(lists)] 
case = Case(*cases, output_field=IntegerField())
queryset = Betting.objects.filter(matches__in=lists)
queryset = queryset.annotate(my_order=case).order_by('my_order')

【讨论】:

  • 谢谢..但是什么是'output_field=IntegerField()'
  • from django.db.models import IntegerField ,用于存储案例检查的输出
【解决方案2】:

不太确定效率,但它可以是一种方式

lists = [Everton, Liverpool, Villa]
queryset = Betting.objects.all()
for i in lists:
    queryset = queryset.filter(matches=i)

你可以这样做的原因是,如果你这样做,queryset.filter(一些条件).filter(一些其他条件),那么结果实际上是两个过滤器按它们的顺序的并集

【讨论】:

    猜你喜欢
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多