django - 从表字段中选择不同的值

标签 django django-queryset django-orm query-performance

我正在努力了解 Django 的 ORM。我想要做的是在我的表的一个字段中获取不同值的列表....等同于以下之一:

SELECT DISTINCT myfieldname FROM mytable

(或者替代地)

SELECT myfieldname FROM mytable GROUP BY myfieldname

在求助于原始 sql 之前,我至少想以 Django 的方式来做。 例如,有一个表:

id, street, city

1, Main Street, Hull

2, Other Street, Hull

3, Bibble Way, Leicester

4, Another Way, Leicester

5, High Street, Londidium

我想得到:

Hull, Leicester, Londidium.

最佳答案

假设您的模型是“商店”

class Shop(models.Model):
    street = models.CharField(max_length=150)
    city = models.CharField(max_length=150)

    # some of your models may have explicit ordering
    class Meta:
        ordering = ('city',)

由于您可能拥有 Metaordering 属性集(元组或列表),您可以使用 order_by() 而无需使用 distinct() 时清除任何排序的参数。请参阅 order_by() 下的文档

If you don’t want any ordering to be applied to a query, not even the default ordering, call order_by() with no parameters.

distinct()在注释中讨论了使用 distinct() 进行排序的问题。

要查询您的数据库,您只需调用:

models.Shop.objects.order_by().values('city').distinct()

它返回一个字典

models.Shop.objects.order_by().values_list('city').distinct()

这一个返回一个 ValuesListQuerySet,您可以将其转换为 list。 您还可以将 flat=True 添加到 values_list 以展平结果。

另请参阅:Get distinct values of Queryset by field

关于django - 从表字段中选择不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2466496/

相关文章:

mysql - django manage.py sql 不显示索引创建语句

django - 删除 Django ORM 中的重复项——多行

python - Django 覆盖表单

django - 使用 Django/Postgres 获取一个计算字段,如果不存在另一个字段值,则获取一个字段值

python - Django 在用户模型中按用户名查询集

python - Django对相关一对多对象的聚合查询

python - Celery 在使用 Django 数据库执行之前撤销任务

python - django过滤包含整数的模型

django - 不破坏 DRY 的自定义 QuerySet 和管理器?

python - Django 明显不与 Postgres 一起工作