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

使用xlwt导出Django模型外键实际值而非ID的方法

解决Django xlwt导出外键字段实际值的问题

方法一:使用values_list关联字段查询

直接在values_list中通过**双下划线(__)**访问外键关联模型的目标字段,比如User的username、Brand的name(需根据实际模型字段调整)。

修改视图中rows的查询代码:

rows = Product.objects.filter(author=request.user).values_list(
    "id",
    "author__username",  # 获取User模型的username字段值
    "brand_id__name",    # 获取Brand模型的name字段值(假设Brand有name字段)
    "name",
    "barcode",
    "unit"
)

注意:如果你的Brand模型显示字段不是name,或者User模型想显示其他字段(如email),替换成对应的字段名即可;若author可能为null,导出时会显示None,可以后续处理为空字符串。

方法二:遍历对象实例手动获取值

这种方式更灵活,能处理空值等特殊情况,还可以直接使用模型__str__方法返回的内容:

修改视图中循环写入的部分:

# 替换原来的rows查询和循环
products = Product.objects.filter(author=request.user)
for product in products:
    row_num += 1
    # 逐个写入各列
    ws.write(row_num, 0, str(product.id), font_style)
    # 处理author为空的情况
    ws.write(row_num, 1, str(product.author) if product.author else "", font_style)
    # 使用Brand模型__str__返回的内容(如果Brand的__str__已定义为显示品牌名)
    ws.write(row_num, 2, str(product.brand_id), font_style)
    ws.write(row_num, 3, product.name, font_style)
    ws.write(row_num, 4, product.barcode, font_style)
    ws.write(row_num, 5, product.unit, font_style)

这种方式不需要关心关联模型的具体字段,只要模型的__str__方法返回了你想要显示的内容,就可以直接用str(外键字段)获取实际值,同时能优雅处理author为null的场景。

内容的提问来源于stack exchange,提问作者Eric Maniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:40:23