You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:27:40