以下SQL语句的Django查询是什么?

时间:2019-12-13 16:19:07

标签: python sql django orm

有一个简单的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多个结果

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

非常感谢!

1 个答案:

答案 0 :(得分:2)

区别在于,在第一个查询中,结果是(sku)s的列表,在第二个查询中是({{11}},sku)s的列表,这是因为last_update中包含的所有字段也都包含在SQL order_by中,因此将distinct应用于不同的集或记录,从而产生不同的计数。

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

查询#1

SELECT

查询#2

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

distinct documentation

中对此行为进行了描述
  

在SELECT_BY()调用中使用的任何字段都包含在SQL SELECT中   列。在以下情况下使用有时会导致意外结果   与distinct()结合使用。如果您按相关领域中的字段排序   模型,这些字段将添加到所选列中,   否则,重复的行似乎是不同的。由于额外   列不会出现在返回的结果中(它们仅用于   支持排序),有时结果似乎不明显   被退回。

     

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

     

这里的道义是,如果您使用distinct(),请注意   按相关模型排序。同样,当使用distinct()和   values()一起使用时,请注意不在字段中排序时   values()调用。