【问题标题】:django queryset orderingdjango 查询集排序
【发布时间】:2012-11-30 19:28:37
【问题描述】:

我正在列出查询集结果,并想添加一个选项来选择显示的订单结果。

我想将实际数据从数据库传递到其他页面进行排序。 我能够通过获取所有对象 id 并使用 django session 根据订单条件重新创建一个新的查询集来实现这样的事情。

我在想是否有其他方法可以实现这个目标?

10 倍

【问题讨论】:

  • 您传递到另一个页面的数据是什么格式的?列表、字典等...
  • 当前是对象 ID 列表
  • 你能告诉我们你所做的一些代码吗..它会更容易理解和建议正确的事情

标签: django django-templates


【解决方案1】:

假设您当前将数据显示为表格,您可以给一些 javascript 客户端表格排序器提供机会,例如 tablesorter。有很多 javascript 表格排序。

【讨论】:

  • 即便如此,只要多做一点工作,您就可以使用客户端 javascript 实现相同的结果,也许使用关联数组的数组和排序算法,否则您需要将数据传回服务器,然后您可以使用以前使用的相同关键字重做查询或传递 id 列表
  • 刚刚实现了前一个选项。您认为它与性能相关的更好解决方案是什么?
  • 好吧,如果数据集足够小,从性能角度来看,在客户端中排序会更好。如果您需要在服务器端进行排序,它完全取决于数据库,但是,使用适当的数据库索引,重做查询或过滤 id 应该几乎是等效的。后面的索引肯定没问题,所以我可能会选择后者,
【解决方案2】:

我现在离开我的开发机器,但我认为您可以将 id 列表传递给新的查询集 pk__in=list_of_object_ids,然后使用本机 order_by 函数。

例如:

objs = Object.objects.filter(pk__in=list_of_object_ids).order_by('value_to_order_by')

无论如何,这就是我会首先尝试的方法,但我确信会有更好的优化。

例如,您可以传递带有键值对的字典,而不是对象 ID 列表。

例如:

[{'obj_id':1,'obj_value':'foo'},{'obj_id':2,'obj_value':'foo'}]

然后使用一些 lambda 函数对其进行排序,例如 here

【讨论】:

  • 但是如果结果列表很大怎么办?这就是为什么我认为只传递 id 列表会更明智,然后点击数据库。我正在寻找优化..(如果有的话)
  • 我认为你可能是对的。除了通过 id 没有其他方法可以获取它们吗?
  • 通过ID搜索数据库是首选方式,也是最快的。
猜你喜欢
  • 2012-07-30
  • 1970-01-01
  • 2020-08-16
  • 2013-09-26
  • 2017-04-12
  • 2014-09-19
  • 1970-01-01
  • 2016-11-30
  • 2013-04-08
相关资源
最近更新 更多