Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django_uu,但返回第一个匹配元素_Python_Django_Django Queryset - Fatal编程技术网

Python Django_uu,但返回第一个匹配元素

Python Django_uu,但返回第一个匹配元素,python,django,django-queryset,Python,Django,Django Queryset,我有这个型号 来自django.db导入模型的 类TranslatedString(models.Model): lang=models.CharField() key=models.CharField() value=models.CharField() 我有此模型的以下实例: a=TranslatedString(lang=“en_US”,key=“my string”,value=“hello world”) b=翻译字符串(lang=“en_AU”,key=“my string”,va

我有这个型号

来自django.db导入模型的

类TranslatedString(models.Model):
lang=models.CharField()
key=models.CharField()
value=models.CharField()
我有此模型的以下实例:

a=TranslatedString(lang=“en_US”,key=“my string”,value=“hello world”)
b=翻译字符串(lang=“en_AU”,key=“my string”,value=“g'day world”)
c=TranslatedString(lang=“ja_JP”,key=“my string”,value=”こんにちは世界")
我有一个用户想要的语言列表

preferred_langs=[“en_CA”、“en_US”、“en_AU”、“fr_CA”]
这是按首选项排序的。我希望返回与该列表中第一项匹配的值。即使
a
b
都与以下查询匹配

TranslatedString.objects.filter(key=“my string”,lang\uu in=preferred\u langs).first()
我希望它按列表排序,这样我总是得到
a


我可以在
preferred\u langs
中对每个元素进行查询,并在找到匹配值后立即返回,但有更好的选择吗?我想在一个查询中进行查询。

如果您不介意从数据库中检索所有首选翻译,可以通过对Python中的模型进行排序来简洁地实现这一点:

preferred_langs = ["en_CA", "en_US", "en_AU", "fr_CA"]
strings = list(TranslatedString.objects.filter(key="my-string", lang__in=preferred_langs))

strings.sort(key=lambda s: preferred_langs.index(s))
first_choice = strings[0]

print(first_choice.lang)  # outputs "en_US"

这将执行单个(但可能较大的)查询。但是,如果首选语言的顺序相当短,则排序应该在可忽略不计的时间内进行。

您可以在
首选语言上使用生成器表达式来生成首选语言到列表中各自索引的映射,如
Case
对象为ted作为一个字段,以便您可以根据它对过滤结果进行排序:

from django.db.models import Case, Value, When

TranslatedString.objects.filter(key="my-string", lang__in=preferred_langs).annotate(
    preference=Case(*(When(lang=lang, then=Value(i)) for i, lang in preferred_langs))
).order_by('preference').first()

如果从数据库中检索多个对象的开销不是问题,那么解析查询集,然后用Python对检索到的模型进行排序可能是最简单的方法。