当前位置: 首页 > 面试题库 >

在django中选择DISTINCT各个列?

涂煌
2023-03-14
问题内容

我很好奇,是否有任何一种方法可以在Django中进行查询,而该查询并非SELECT * FROM...位于下方。我正在尝试执行“ SELECT DISTINCT columnName FROM ...”

具体来说,我有一个看起来像这样的模型:

class ProductOrder(models.Model):
   Product  = models.CharField(max_length=20, promary_key=True)
   Category = models.CharField(max_length=30)
   Rank = models.IntegerField()

其中Rank是内的排名Category。我希望能够遍历所有类别,对该类别中的每个等级进行一些操作。

我想先获取系统中所有类别的列表,然后查询该类别中的所有产品,然后重复进行直到处理完每个类别。

我宁愿避免使用原始SQL,但是如果我必须去那里,那很好。尽管我以前从未在Django / Python中编写过原始SQL。


问题答案:

从数据库中获取不同列名列表的一种方法是与distinct()结合使用values()

对于你的情况,可以执行以下操作以获取不同类别的名称:

q = ProductOrder.objects.values('Category').distinct()
print q.query # See for yourself.

# The query would look something like
# SELECT DISTINCT "app_productorder"."category" FROM "app_productorder"

这里有几件事要记住。首先,这将返回ValuesQuerySet与的行为不同的QuerySet。当你说出q(上面的)第一个元素时,你会得到一个字典,而不是的实例ProductOrder

其次,最好阅读文档中有关using 的警告说明distinct()。上面的例子可以工作,但所有的组合distinct(),并values()可能不会。

PS:在模型中的字段中使用小写字母是一个好主意。在你的情况下,这意味着重写模型,如下所示:

class ProductOrder(models.Model):
    product  = models.CharField(max_length=20, primary_key=True)
    category = models.CharField(max_length=30)
    rank = models.IntegerField()


 类似资料:
  • 问题内容: 我想在数据库中选择不同的值。让我来看一个简单的例子。 表: 是的,假设我的SQL是。这些是我的结果: 但是,问题在于/ 重复的顺序不同。我不想选择这些,我希望这两列中都有不同的值,请帮忙! 问题答案: 非常邪恶和邪恶:

  • 问题内容: 我可以从一个表中的列中执行以下SQL Server选择不同(或非重复名称)的操作,如下所示: 但是,如果我有多个表(所有这些表都包含名为[Name]的名称字段),并且我需要知道两个或多个表中非重复名称的计数,该怎么办? 如果我运行这样的事情: 我收到一个错误,“歧义列名’Name’”。 PS。这三个表[MyTable1],[MyTable2],[MyTable3]都是先前选择的产品。

  • 问题内容: 我正在寻找一个在Django日期之间进行选择的查询。 我知道如何使用原始SQL轻松做到这一点,但是如何使用Django ORM做到这一点呢? 这是我要在查询中添加30天之间的日期的地方: 问题答案: 使用运算符:

  • 问题内容: 如果我有桌子 并且我想获取字段的所有唯一值,这会更快(或建议使用): 要么 ? 问题答案: 它们本质上是彼此等效的(实际上这就是某些数据库在后台实现的方式)。 如果其中之一更快,那就快了。这是因为,尽管两者相同,但是查询优化器将不得不抓住一个事实,即您没有利用任何组成员,而只是利用了他们的键。明确说明这一点,因此您可以使用稍微笨拙的优化程序。 如有疑问,请测试!

  • 问题内容: 我有3张桌子: 我想显示所有车辆名称的列表。如果,也应返回。 所以我想我将从这里开始: 返回以下内容: 但是,我现在无法将其范围缩小到所需的结果。如果使用,则没有任何变化,因为我已经在JOIN之前选择了不同的汽车ID。加入后它们才是唯一的。如果使用,则删除最后两行,所有对货车的引用都消失了。如果使用,则将第一行和最后一行合并,但是摩托车的则是任意选择的。我想要的是: 我需要一个唯一的汽

  • 问题内容: 如果我有表 并且我想获取所有唯一值的字段,这会更快(或建议): 或者 ? 问题答案: 它们本质上是彼此等效的(实际上,这就是某些数据库在后台实现的方式)。 如果其中之一更快,那就快了。这是因为,尽管两者相同,但查询优化器将不得不抓住一个事实,即您没有利用任何组成员,而只是利用了他们的键。明确说明这一点,因此您可以使用稍微笨拙的优化程序。 如有疑问,请进行测试!