我想在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
模型。
答案 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)