Django检索不同列值的行

时间:2019-04-12 13:22:51

标签: python django django-models

我想在Django中查询模型行,

class Language(models.Model):
    language_id = models.CharField(max_length=100, default="")
    code = models.CharField(max_length=100, default="")
    name = models.CharField(max_length=500, default="")

在此表中,language_id不是唯一的,例如,下面是示例数据

+-------------+------+---------+
| language_id | code | name    |
+-------------+------+---------+
|       12345 | en   | english |
|       12345 | te   | telugu  |
|       54321 | en   | english |
|       54321 | te   | telugu  |
+-------------+------+---------+

我想过滤应该具有不同language_id的行(所有列)。

我目前正在做什么。

language_list = Language.objects.all()

list = []
idlist = []

for language in language_list:
    if language.language_id not in idlist:
        il = language
        list.append(il)
        idlist.append(language.language_id)

然后list将具有所有不同的行(模型对象)。

有没有更好的方法可以做到这一点。我不想遍历所有language模型。

1 个答案:

答案 0 :(得分:4)

目前尚不清楚您要做什么。 您的脚本所做的是任意获取给定ID的第一次出现。 如果这是您想要的,则取决于模型所基于的数据库。 PostgreSQL允许在字段上使用distinct: https://docs.djangoproject.com/en/2.1/ref/models/querysets/#distinct

在MySQL上,您可以做的是获取id的所有唯一实例,并获取每个ID匹配一次的模型实例:

language_ids = Language.objects.values_list('language_id', flat=True).distinct()
result = []
for language_id in language_ids:
    result.append(Language.objects.filter(language_id=language_id).first())

这不一定比您的解决方案好得多,仅仅是因为任意选择不是ORM的预期用例。

另一方面,如果您只想获得一次出现一次的language_id:

Language.objects.values('language_id').annotate(cnt=Count('id')).filter(cnt=1)