【问题标题】:Yet another QuerySet custom ordering problem另一个 QuerySet 自定义排序问题
【发布时间】:2011-04-29 03:56:23
【问题描述】:

找了好久,一无所获。

在我的 django 应用中,我的用户使用非常标准的评分模型对 Model_X 进行评分。我有一个处理大量数据的独立函数,当给定一个用户实例时,它返回一个元组列表。第一个值对应于 Model_X 实例的主键,第二个是预测评分。例如,它可能会返回以下元组列表。

[(1L, 5.25), (5L, 3.1), (23L, 1.83)]

我需要返回 Model_X 的 QuerySet(它必须是 QuerySet),仅包含元组中列出的实例,并按元组中的这些预测评级排序。

【问题讨论】:

  • 我知道我可以使用 python sorted() 函数来执行此操作,但我需要它来返回一个 QuerySet,据我所知,使用 sorted() 函数无法完成。
  • 你能添加一些代码来解释你的模型吗?我不完全了解您的示例所代表的内容。来自一个模型及其实例或来自不同模型组合实例的字段值?
  • 我已经改写了我的问题,希望让它更清楚一点。这有帮助吗?模型上的字段值在这个过程中根本不起作用。
  • 你真的需要返回一个 QuerySet 吗?
  • 我想到了一个 O(n) 解决方案,您正在使用列表中的值链接查找以保持顺序......但希望有人能提供更好的解决方案。

标签: python django django-queryset


【解决方案1】:

如果您的评级元组列表已经排序,您可能可以使用来自Ordering by the order of values in a SQL IN() clause 的内容。

如果您使用的是 MySQL,那么 field() 函数应该适合您。从您的排序评级元组中提取所有 ID,[x[0] for x in sorted_tuples],然后使用该 ID 列表来构建您的 where 子句,例如(未经测试),

Model_X.objects.raw('select * from myapp_model_x where id in (5,1,23) order by field(id,5,1,23)']) 

【讨论】:

  • 我可能做错了,但是使用你的语法它会从 where 语句中的“order by field...”语句开始吐出一个错误。
  • 啊,真不幸。您可能必须下拉到raw query 才能正确运行它。你在用 MySQL 吗?
  • 我将只使用我的替代方案,即使用 python 的排序并重写我的视图。我不敢相信这是做不到的。似乎是一个需要解决的重大缺陷。
【解决方案2】:

使用列表而不是查询集。您可以使用 in_bulk 轻松构建它

【讨论】:

  • 在多个地方都非常具体,我正在寻找返回 QuerySet 的解决方案。
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多