Django get_FOO_display和distinct()

时间:2010-05-17 05:44:19

标签: django django-models distinct

我已经看到了问题的两半答案,但我无法弄清楚如何将两者结合。

我有一个书模型和一个翻译的书模型。

翻译的书籍以通常的方式设置为模型选择:

LANGUAGES = ( 
(u'it', u'Italian'),
(u'ja', u'Japanese'),
(u'es', u'Spanish'),
(u'zh-cn', u'Simplified Chinese'),
(u'zh-tw', u'Traditional Chinese'),
(u'fr', u'French'),
(u'el', u'Greek'),
(u'ar', u'Arabic'),
(u'bg', u'Bulgarian'),
(u'bn', u'Bengali'),

我知道要获得“意大利语”,我必须在Book对象上翻译Book.get_language_display。

但是如何以长格式获取不同语言列表?

我试过了:

lang_avail = TargetText.objects.values('language').distinct().order_by('language')

lang_avail = TargetText.objects.distinct().order_by('language').values('language').

lang_avail = TargetText.objects.all().distinct('language').order_by('language')

但我似乎无法得到我想要的东西 - 这是一个列表:

“英语,意大利语,简体中文,西班牙语”

上面列出的最终lang_avail没有返回5的列表,它返回了355(即书籍数量)的列表,包含多个重复....

- 编辑 -

丹尼尔的回答几乎把我带到了那里 - 事实证明,这引发了“不可避免的错误”。感谢django irc上的Axiak,我们使用Daniel的解决方案:

langs = TargetText.objects.values_list('language', flat=True).distinct().order_by('language')

它有效。

1 个答案:

答案 0 :(得分:1)

没有内置方式。你可以这样做:

lang_dict = dict(LANGUAGES)
langs = TargetText.objects.values('language').distinct().order_by('language')
long_langs = [lang_dict[lang] for lang in langs]

它只是从LANGUAGE选项中创建一个字典,然后查找每个语言ID。