django - 在 Django 中选择不同的单个列?

标签 django django-models distinct django-queryset django-orm

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

这里有几件事要记住。首先,这将返回一个 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/

相关文章:

python - Django 静态文件不会显示在生产服务器中。如何正确映射它们,以便我可以看到管理 GUI

python - 跨服务器同步文件名

django - 从 Django 中的不同类获取值

sql - Oracle 中的 Order By 导致 ORA-01791 : not a SELECTed expression

c# - 获取行中值计数 > 1 的不同行?

python - 无法在 Django 1.1 中测试持久 session

django - 基于约束的自定义外键值

python - 在 Django 中,动态路径更改时如何移动图像?

python - 获取django中的所有字段选项

mysql - 5 个表 -> 显示某些不同的行