【问题标题】:Django order_by('?') filter with distinct()Django order_by('?') 过滤器与 distinct()
【发布时间】:2018-01-08 05:53:16
【问题描述】:

我想检索唯一的外键实例并随机排序 但是,当我想使用 order_by('?') 时出现错误

我的查询是这样的:

qs=Course.objects.distinct('courseschedule__object_id').order_by('courseschedule__object_id')

这个查询很好用,但现在我想随机订购(每次都得到随机结果),我试试这个

qs=qs.order_by('?')

我收到了这个错误:

django.db.utils.ProgrammingError: SELECT DISTINCT ON 表达式必须匹配初始 ORDER BY 表达式

知道如何解决吗?我的数据库是 Postgres,我不想做 rawSQL.... 非常感谢你们的帮助!!!!

【问题讨论】:

标签: django postgresql


【解决方案1】:

首先,根据querysetsDjango,使用数据库的随机顺序既昂贵又缓慢。其次,在我看来,不要使用数据库返回随机顺序,而是从数据库中获取您的查询,而不是不同的(因为它也可能很慢),使用 python 方法对查询进行洗牌,例如:randomOrder 并制作一个 set()进而 。这样你就不是使用数据库来做你的事情,而是使用纯 python 代码。

【讨论】:

  • 当然可以,但我认为使用后端比使用数据库更有效。我没有做任何时间测试。只是猜测。
  • 别管前面的评论,我是个白痴,早上评论太早(混合顺序和抽样)。
  • 好吧,别担心,:)
  • 这两个确实经常重叠,因为人们使用随机顺序+限制进行随机抽样,但这个问题似乎不同,现在我花时间正确阅读它。
  • 我知道使用数据库的随机顺序很昂贵,但是这个函数在 ListAPIView 中,我必须返回查询集....否则,我必须覆盖我队友已经编写的所有过滤器以前,我不想这样做..所以知道如何使用查询集来做到这一点。谢谢!!!!!!
猜你喜欢
  • 2014-01-02
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2015-04-30
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
相关资源
最近更新 更多