Django Admin中Campania模型无法显示多对多关联Cedi的nombre值
问题排查与修复
当前自定义列内容为空,核心是两个高频触发点:
- 引入
ImportExportMixin后,Admin的字段解析优先级会向导入导出资源类倾斜,未做显式标记的自定义方法会被资源类的空字段配置覆盖,导致返回空值 - 未对多对多关联做预加载,部分Django版本的Admin查询缓存会导致关联字段取值失败,同时会产生N+1查询性能问题
修复代码
直接替换原有CampaniaAdmin配置即可:
@admin.register(Campania) class CampaniaAdmin(ImportExportMixin, admin.ModelAdmin): resource_class = CampaniaResource list_display = ('nombre', 'descripcion', 'cedi') list_filter = ('nombre', ) readonly_fields = ('fecha_creacion', 'fecha_modificacion') search_fields = ['nombre',] def get_queryset(self, request): qs = super().get_queryset(request) # 预加载多对多关联数据,解决取值异常+N+1性能问题 return qs.prefetch_related('cedis') # 显式标记为Admin展示字段,括号内的description为列表显示的列名,可按需修改 @admin.display(description='Cedi') def cedi(self, obj): return ", ".join([cedi.nombre for cedi in obj.cedis.all()])
如果你使用的Django版本低于3.2,不支持
@admin.display装饰器,可以直接给方法加short_description属性,替换装饰器写法即可:def cedi(self, obj): return ", ".join([cedi.nombre for cedi in obj.cedis.all()]) cedi.short_description = 'Cedi'
异常排查
如果改完后内容还是为空,按以下顺序排查:
- 先把
cedi方法的返回值临时改成固定字符串,比如return "测试",刷新页面:- 如果固定字符串能正常显示,说明代码逻辑没问题,检查对应Campania实例是否真的绑定了Cedi关联数据即可
- 如果固定字符串也不显示,打开
CampaniaResource配置,把cedi从Resource的fields列表中删除,避免导入导出模块的字段解析覆盖Admin自定义方法
- 修改代码后必须重启Django服务,避免代码缓存导致修改不生效
内容的提问来源于stack exchange,提问作者0M1N1D0
相关产品推荐
相关产品推荐

