Django ORM:如何根据所有记录中的列获取唯一记录(需要模型对象而不是特定值对象)

Posted

技术标签:

【中文标题】Django ORM:如何根据所有记录中的列获取唯一记录(需要模型对象而不是特定值对象)【英文标题】:Django ORM: How to get unique records based on a column from all records(Need model object not particular value object) 【发布时间】:2016-08-11 05:08:19 【问题描述】:

使用 mysql 作为后端数据库。查询数据库中的所有记录,例如:

ob = Shop.objects.all()

这里查询所有记录,因为需要所有 n 个列的值。那就来答题吧。

想要获取基于某一列的所有不重复记录。尝试使用 Python SET 函数。但它会删除完全相同的记录。我的记录在特定列值中具有相同的值,但在其他列中的值不同。

有人可以在 Django ORM 的帮助下分享一些想法吗!!!

【问题讨论】:

你的意思是你想要“不同的”值吗?... 是的。我尝试使用 distinct..但是 mysql 在 django orm 中不支持 distinct。 Select DISTINCT individual columns in django?的可能重复 我的数据库不支持 DISTINCT 函数。我无法更改任何其他数据库..Rigth 现在使用 Mysql .....知道吗??? 那个答案是针对mysql的,你可以在mysql上使用distinct(据我所知),但只有postgres支持distinct(fields) 【参考方案1】:

如果我正确理解了您的问题,您只想检索没有重复的记录。你可以用这个查询来做到这一点:

SELECT * from shops GROUP by (duplicate_field_name) having COUNT(*) = 1

如何用 django 做到这一点?那么 GROUP by 是 Django 最糟糕的地方。但是,这可以通过原始查询来实现。

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

记得将shopsduplicate_field_name分别替换为实际的表名和列名。

【讨论】:

我在应用 order_by 时收到此错误“RawQuerySet”对象没有属性“order_by”。我该怎么办? 你清楚地理解了Q。但现在我还没有得到答案。我可以期待任何帮助吗? 是的,您不能将 order_by() 调用与原始查询集一起使用。您可以做的是将排序添加到查询本身。正在更新答案。 我无法通过查询本身添加排序。因为我在某些上下文中需要这些记录,然后只有我可以应用排序。在我的功能中断之前 还有一件事我正在传递一个订购清单..那么我该如何继续?

以上是关于Django ORM:如何根据所有记录中的列获取唯一记录(需要模型对象而不是特定值对象)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django ORM 使用 UNION 指定 SELECT 中的列顺序

如何根据两个逗号分隔值的列中的任何一个值获取记录

如何编写 hql 查询或条件查询以根据时间戳获取最新记录

Django:显示/记录来自 python shell 的 ORM sql 调用

Django ORM:如何根据注释 timedelta 结果进行过滤

Django ORM命令获取没有空字段的不同值