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

Django Admin中如何显示QuerySet首条关联数据的字段值

Django Admin 显示关联集合第一条记录的字段值解决方案

问题分析

你的get_production_company_name方法存在两个核心问题:

  • 使用values()返回的是包含所有关联数据的QuerySet,而非单条记录的具体字段值
  • 重复查询数据库会造成不必要的性能损耗,且未限定只取第一条关联记录

修正后的Admin代码

class FeatureFilmAdmin(admin.ModelAdmin):
    inlines = [
        QuoteAndEffortSetInLine,
        ProjectCompanySetInLine,
        VendorVFXSetInLine,
        VendorSetInLine,
        StaffListSetInLine,
    ]
    list_display = ["title", "program_length", "get_production_company_name"]
    # 预取关联数据,避免列表页N+1查询性能问题
    list_prefetch_related = ("projectcompanyset_set__production_company",)

    def get_production_company_name(self, obj):
        # 获取关联的ProjectCompanySet第一条记录
        first_project_company = obj.projectcompanyset_set.first()
        # 空值判断,避免报错
        if first_project_company and first_project_company.production_company:
            return first_project_company.production_company.name
        # 无数据时返回占位文本
        return "-"
    # 给自定义列设置友好显示名称
    get_production_company_name.short_description = "制作公司"

关键修改说明

  1. 直接通过实例关联获取数据:利用Django ORM的反向关联obj.projectcompanyset_set.first()直接拿到第一条ProjectCompanySet记录,无需重复查询FeatureFilm表
  2. 空值容错处理:增加多层判断,避免因无关联记录或production_company为空导致的页面报错
  3. 性能优化:添加list_prefetch_related预取关联数据,解决列表页批量加载时的N+1查询问题
  4. 列名优化:通过short_description给自定义列设置更直观的显示名称

额外注意事项

如果你的ProjectCompanySet模型的feature字段设置了related_name,需要把代码中的projectcompanyset_set替换为对应的related_name值。例如:
若feature字段定义为:

feature = models.ForeignKey(
    FeatureFilm,
    on_delete=models.CASCADE,
    null=True,
    blank=True,
    related_name="project_companies"
)

则需将代码中的obj.projectcompanyset_set.first()改为obj.project_companies.first()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:45:54