Django如何在过滤器中显示@property字段bar的值?
问题解答
你没法直接用values()获取bar字段,原因很简单:bar是模型的@property属性,属于Python层面的动态计算值,并不存在于数据库中;而QuerySet.values()是直接生成SQL查询,只会提取数据库里实际存在的字段,不会触发Python属性的计算逻辑。
给你两种可行的解决办法:
方法一:先查实例再提取属性
先获取Foo的实例对象,再逐个提取foo_city和bar属性,转换成字典列表:
foos = Foo.objects.filter(foo_name="João") result = [{"foo_city": foo.foo_city, "bar": foo.bar} for foo in foos]
方法二:用annotate将逻辑转成数据库查询
把bar的判断逻辑转换成数据库层面的Exists子查询,通过annotate添加为QuerySet的字段,这样就能用values()直接获取了,这种方式效率更高(计算在数据库完成):
from django.db.models import Exists, OuterRef # 先annotate添加bar字段,再用values提取 result = Foo.objects.filter(foo_name="João").annotate( bar=Exists( FooAction.objects.filter( foo_id=OuterRef('pk'), action=Action.ACTION_NAME_PK ) ) ).values("foo_city", "bar")
内容的提问来源于stack exchange,提问作者Giovani Faleiros
相关产品推荐
相关产品推荐

