【问题标题】:What is the Django query for the below SQL statement?以下 SQL 语句的 Django 查询是什么?
【发布时间】:2019-12-13 16:19:07
【问题描述】:

有一个简单的 SQL 表,它有 3 列:id、sku、last_update 和一个非常简单的 SQL 语句:SELECT DISTINCT sku FROM product_data ORDER BY last_update ASC

上述 SQL 语句的 django 视图代码是什么?

此代码:
q = ProductData.objects.values('sku').distinct().order_by('sku')
返回 145 个结果

而此语句:
q = ProductData.objects.values('sku').distinct().order_by('last_update')
返回超过 1000 个结果

为什么会这样?有人可以帮忙吗?

提前非常感谢!

【问题讨论】:

  • 如果查询已经下单了,还需要在视图中再下单吗?
  • 表示通过点击表头来管理排序的表。因此,根据“排序状态”,我需要按“sku”或“last_update”对其进行排序。但我很惊讶 Django ORM 不能轻松处理如此简单的 SQL 语句。例如,通过 SQLalchemy 来做这件事太容易了……
  • 哦,我明白了。好吧,在我看来,django 正确地认为,要按 sku 排序视图,输出中必须存在 sku 字段,这会破坏您的 distinct()。

标签: python sql django orm


【解决方案1】:

不同之处在于,第一个查询的结果是 (sku) 的列表,第二个查询的结果是 (sku, last_update) 的列表,这是因为 @ 中包含的任何字段987654325@,也包含在 SQL SELECT 中,因此将 distinct 应用于不同的集合或记录,从而产生不同的计数。

查看 Django 生成的查询,它们应该类似于以下内容:

查询 #1

>>> str(ProductData.objects.values('sku').distinct().order_by('sku'))
'SELECT DISTINCT "yourproject_productdata"."sku" FROM "yourproject_productdata" ORDER BY "yourproject_productdata"."sku" ASC'

查询 #2

>>> str(ProductData.objects.values('sku').distinct().order_by('last_update'))
'SELECT DISTINCT "yourproject_productdata"."sku", "yourproject_productdata"."last_update" FROM "yourproject_productdata" ORDER BY "yourproject_productdata"."last_update" ASC'

distinct documentation 中描述了此行为

在 order_by() 调用中使用的任何字段都包含在 SQL SELECT 中 列。这有时会在使用时导致意想不到的结果 与 distinct() 结合。如果您按相关领域的字段排序 模型,这些字段将被添加到选定的列中,并且它们可能 使否则重复的行看起来是不同的。由于额外 列不会出现在返回的结果中(它们只是为了 支持排序),有时看起来不明显的结果是 被退回。

同样,如果您使用 values() 查询来限制列 选中,在任何 order_by() (或默认模型)中使用的列 ordering) 仍然会涉及,并且可能会影响 结果。

这里的寓意是,如果您使用 distinct() 时要小心 按相关型号订购。同样,当使用 distinct() 和 values() 一起,当按不在的字段排序时要小心 values() 调用。

【讨论】:

  • 这是澄清这一切的关键短语:“order_by 中包含的任何字段,也包含在 SQL SELECT 中”。非常感谢!
  • 没问题,如果回答了您的问题,请不要忘记将答案标记为已接受
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 2020-04-14
  • 2021-11-17
相关资源
最近更新 更多