在django中选择DISTINCT个别列?

我很好奇,是否有任何方法可以在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()

RankCategory的排名。 我希望能够遍历所有类别在该类别中的每个等级上进行一些操作。

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

我宁愿避免原始的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"

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

其次,阅读有关使用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()

实际上, 如果你使用的是PostgreSQL ,这很简单,只需要使用distinct(columns)

Productorder.objects.all().distinct('category')

请注意,此功能自1.4版以来已包含在Django中


其他的答案都很好,但是这样会更清晰一些,因为它只给出像从DISTINCT查询中获得的值,而不会从Django中传出任何信息。

>>> set(ProductOrder.objects.values_list('category', flat=True))
{u'category1', u'category2', u'category3', u'category4'}

要么

>>> list(set(ProductOrder.objects.values_list('category', flat=True)))
[u'category1', u'category2', u'category3', u'category4']

而且,它没有PostgreSQL。

这比使用.distinct()效率低,假设数据库中的DISTINCT比python set更快,但对于在shell中进行讨厌很好。

链接地址: http://www.djcxy.com/p/38699.html

上一篇: Select DISTINCT individual columns in django?

下一篇: MySQL: What is a reverse version of LIKE?