通常,使用基于Manager的查询返回模型对象可能会更好,更容易。听起来您原始方法的问题不在于您要遍历查询集(如@ahmoo所说,这不是性能问题),而是在迭代循环中您正在获取其他相关对象,需要一个或多个对象每个记录的其他查询。
听起来最相关的是select_related()
,它将有效地对初始查询进行表联接,以包含与外键相关的所有对象的数据。
如果这还不够,您还可以使用来将数据添加到模型实例中extra()
,从而可以将子查询粘贴到sql中。
如果所有操作失败,您可以使用Manager实例上的方法执行原始SQL查询.raw()
,该实例仍将返回模型实例。
基本上,如果您可以在sql中以每个实例只给您一行的方式进行操作,则有一种方法可以在Django中进行操作并返回模型实例。
不过,要回答您的原始问题,您可以通过Field类获取显示名称-这很丑陋:
def get_field_display(klass, field, value):
f = klass._Meta.get_field(field)
return dict(f.flatchoices).get(value, value)
# usage
get_field_display(User, 'name', 'JSmith001')