【问题标题】:Django ORM: Apply ordering to raw query setsDjango ORM:将排序应用于原始查询集
【发布时间】:2016-04-20 11:33:21
【问题描述】:

这里是原始查询集 Django ORM:

ob = Shop.objects.raw('SELECT * from shops GROUP BY
 (duplicate_field_name) having COUNT(*) = 1 ORDER BY some_field')

listorder = ["check_in","check_out","location"]

这个 listorder 部分是动态的。我不知道会怎么样。它会不时更改排序,还有一件事不能对原始查询集应用排序,因为我想要整个数据用于其他目的。之后只有我可以应用排序。 这里要按列表“listorder”排序。

mObj = ob.order_by[*listorder].

在上述面临的错误中,例如无法将排序应用于原始查询集。 有人知道吗?

【问题讨论】:

  • 您的意思是 check_in、check_out 和 location 是 Shop 模型的成员,并且您想通过它来订购原始结果集吗?
  • 必须是原始 SQL 吗?也许你可以使用Django's extra() clause,它确实支持order_by kwarg。

标签: django django-queryset django-orm


【解决方案1】:

如果您希望原始查询集按不同字段排序,可以将它们添加到 ORDER BY 子句中。

ob = Shop.objects.raw('SELECT * from shops GROUP BY
 (duplicate_field_name) having COUNT(*) = 1 ORDER BY check_in, check_out, location')

如果您希望特定字段的顺序颠倒,您可以将其更改为

ob = Shop.objects.raw('SELECT * from shops GROUP BY
 (duplicate_field_name) having COUNT(*) = 1 ORDER BY check_in, check_out DESC, location')

如果排序是动态的,您可以动态创建查询字符串。

qs = ''SELECT * from shops GROUP BY
 (duplicate_field_name) having COUNT(*) = 1'

# some other code here to decide what your ordering is example
order_fields = ['id','location','check_in','check_out']

qs = qs + "ORDER BY " + ",".join(order_fields)

然后就可以像以前一样查询了

Shop.objects.raw(qs)

【讨论】:

  • 同样的事情。请参阅我有一个列名的列表,该列表会不时变化。我不知道里面是什么。只是为了理解我已经给出了。最后我有一个清单。在我想要订购的列表的帮助下。现在告诉我如何继续使用 Django ORM。希望您还记得我的最后一个问题,即根据特定列从表中获取唯一记录。现在我想要 Django ORM,这样它就可以检索所有记录,然后在 list(listorder) 的帮助下开始应用排序
  • 如果您不明白我的问题,请告诉我更多解释。
  • 我想我已经理解了你的问题和你的评论。这个答案完全符合你的问题。
  • 是否可以将排序作为列表应用于原始查询集?
  • 您能否根据问题重新回答答案。就像原始查询集一样。那会很棒,因为我很困惑如何使用 Django ORM 原始查询集来实现它。
猜你喜欢
  • 2013-11-07
  • 2018-05-15
  • 2021-09-23
  • 2022-08-18
  • 2020-08-28
  • 2019-08-05
  • 2019-06-11
  • 1970-01-01
  • 2013-09-26
相关资源
最近更新 更多