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

如何在Django中通过函数实现关联表字段在Admin后台的正常显示

问题原因

你遇到的报错是因为在自定义user_dept方法中直接返回了Account类的department字段对象,没有绑定具体的用户实例,所以输出的是字段类本身的内存地址,而不是实例对应的字段值。

修复步骤

1. 修正自定义展示方法

将RiskRegisterAdmin中的user_dept方法改为从当前行的实例对象中取关联用户的部门值:

def user_dept(self, obj):
    # obj是当前行的RiskRegister实例,user是关联的Account实例
    return obj.user.department

同时可以给该字段增加展示名、排序支持,在方法下方补充配置:

# 设置Admin列表页该列的表头名称
user_dept.short_description = '用户部门'
# 设置点击该列表头时的排序规则,关联到Account表的department字段
user_dept.admin_order_field = 'user__department'

2. 修正搜索字段配置

Django Admin的search_fields不支持直接搜索自定义方法的字段,你需要用双下划线语法直接关联到Account表的department字段实现搜索,修改search_fields配置:

search_fields = ['id', 'user__username', 'user__department', 'date', 'category', 'roles', 'responderID', 'severity', 'created_at']

这里额外增加了user__username支持搜索用户名,你可以根据实际需求调整。

前提:你的RiskRegister模型中user字段必须是外键关联到Account模型,以上配置才能正常生效。

修改后完整admin.py代码
from django.contrib import admin
from .models import RiskRegister, Category, Severity, RSev
from account.models import Account

class RiskRegisterAdmin(admin.ModelAdmin):
    list_display = ['id', 'user', 'user_dept', 'date', 'category', 'roles', 'responderID', 'severity',
                    'action_taken_explanation', 'created_at']
    list_filter = ['id', 'user', 'date', 'category', 'roles', 'responderID', 'severity', 'action_taken_explanation']
    search_fields = ['id', 'user__username', 'user__department', 'date', 'category', 'roles', 'responderID', 'severity', 'created_at']
    
    def user_dept(self, obj):
        return obj.user.department
    user_dept.short_description = '用户部门'
    user_dept.admin_order_field = 'user__department'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:24:06