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 = "制作公司"
关键修改说明
- 直接通过实例关联获取数据:利用Django ORM的反向关联
obj.projectcompanyset_set.first()直接拿到第一条ProjectCompanySet记录,无需重复查询FeatureFilm表 - 空值容错处理:增加多层判断,避免因无关联记录或production_company为空导致的页面报错
- 性能优化:添加
list_prefetch_related预取关联数据,解决列表页批量加载时的N+1查询问题 - 列名优化:通过
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_
相关产品推荐
相关产品推荐

