Django过滤查询后外键转为整数,需保留外键原始显示
解决Django过滤后外键显示异常问题
问题核心很直白:values()方法返回的是字典集合,外键字段只会存储关联对象的ID;而直接调用all()或filter()(不带values())返回的是模型实例集合,能通过外键属性直接访问关联对象的内容。
给你三种可行的解决办法:
方案1:直接使用filter()(推荐)
完全不需要调用values(),保持返回模型实例即可:
clients_list = Clients.objects.filter(cli_account='123')
如果担心外键查询的性能问题(比如触发多次数据库查询),可以用select_related()预取关联数据,避免N+1查询:
clients_list = Clients.objects.filter(cli_account='123').select_related('cli_status')
这样在HTML里依然可以用{{ obj.cli_status }}正常获取关联对象的内容,和全量查询时的表现完全一致。
方案2:用values()指定关联字段
如果确实需要返回字典形式(比如只需要部分字段),可以在values()里明确指定外键的关联字段(用双下划线__关联):
# 假设cli_status关联的模型有一个name字段表示状态文本 clients_list = Clients.objects.filter(cli_account='123').values( 'id', 'cli_account', 'cli_status__name' )
之后在HTML里通过{{ obj.cli_status__name }}来显示状态内容。
方案3:用annotate()添加自定义字段
通过annotate()给查询集的实例添加一个自定义字段,直接存储外键关联的内容:
from django.db.models import F clients_list = Clients.objects.filter(cli_account='123').annotate( status_text=F('cli_status__name') )
之后在HTML里可以直接用{{ obj.status_text }}获取状态内容,同时保留模型实例的其他属性。
内容的提问来源于stack exchange,提问作者Alexis Verovkin
相关产品推荐
相关产品推荐

