我很好奇是否有任何方法可以在 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
。当您访问 say 时,q
的第一个元素(上图)您将获得一个字典,而不是 ProductOrder< 的实例
。
其次,阅读 warning note 是个好主意在关于使用 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()
关于django - 在 Django 中选择不同的单个列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3852104/