【问题标题】:How not to order a list of pk's in a query?如何不在查询中订购 pk 列表?
【发布时间】:2012-09-01 15:10:25
【问题描述】:

我有一个 pk 列表,我想按照我的列表定义的顺序获得结果......但是元素的顺序正在改变。任何人如何帮助我?

print list_ids

[31189、31191、31327、31406、31352、31395、31309、30071、31434、31435]

obj_opor=Opor.objects.in_bulk(list_ids).values()

for o in obj_oportunidades:
   print o

31395 31435 31434 30071 31309 31406 31189 31191 31352 31327

这个对象应该用在模板中,向用户展示一些结果……但是你怎么看,顺序和原来的list_ids不一样

【问题讨论】:

标签: django django-models django-views


【解决方案1】:

如果在 SQL 中拥有这个功能会很高兴 - 按已知的值列表排序。

相反,你可以做的是:

obj_oportunidades=Opor.objects.in_bulk(list_ids).values()

all_opor = []
for o in obj_oportunidades:
    print o
    all_opor.append(o)

for i in list_ids:
    if i in all_opor:
        print all_opor.index(i)

缺点是您必须先获取所有结果行并存储它们,然后才能按照您想要的顺序获取它们。 (all_opor 可以是上面的字典,表记录存储在值中,PKeys 作为字典键。)

另外,使用 (Sort_Order, Pkey) 创建一个临时表并将其添加到查询中:

Sort_Order        PKey
    1            31189
    2            31191
...

因此,当您对 Sort_Order 和 Opor.objects 进行排序时,您将按照您指定的顺序获得 Pkeys。

【讨论】:

  • 您好 Aneroid,感谢您的回答。我不认为我能做到这一点,让我说为什么......这段代码在我的view.py中,应该返回到我的模板中。在模板中,我应该访问对象值。所以......我们的想法是将此查询的结果以正确的顺序发送到模板。
  • 那么上面的循环方法应该可以了;而不是查询更改。您仍然必须首先在 list_ids 中预定义订单或以其他方式获取它。 all_opor dict 中的值可以保存其余记录的剩余值。所以{PK_1: [col1, col2,...], PK_2: [col1, col2, ...]} 等以及PK_1、PK_2 的顺序存储在list_ids 中,您第二次循环。当然,your answer 第二种方式(通过 SQL)但直接在 django 中。
  • 非常感谢您的解释:-D
【解决方案2】:

我在http://davedash.com/2010/02/11/retrieving-elements-in-a-specific-order-in-django-and-mysql/ 中找到了一个解决方案,它非常适合我。

ids = [a_list, of, ordered, ids]
addons = Addon.objects.filter(id__in=ids).extra(
        select={'manual': 'FIELD(id,%s)' % ','.join(map(str,ids))},
        order_by=['manual'])

此代码的作用类似于 MySQL “ORDER BY FIELD”。

【讨论】:

  • +1 使用FIELD() 函数是实现此目的的好方法。猜猜我得到了“如果在 SQL 中有这个功能会很高兴above
  • (顺便说一句,你应该在这里“接受”你自己的答案,因为这是实现这一目标的理想方式。)
【解决方案3】:

这家伙:http://blog.mathieu-leplatre.info/django-create-a-queryset-from-a-list-preserving-order.html

解决了 MySQLPostgreSQL 的问题!

如果您使用的是 PostgreSQL,请转到该页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多