首页 > 解决方案 > 如何使用 django 中的函数在另一个表中显示值

问题描述

我一直在尝试让 search_fields 能够在 django 管理页面上的另一个表中搜索字段。我发现我可以使用一个函数来实现我的目标,但是当我进入管理页面时,它会显示 <django.db.models.query_utils.DeferredAttribute object at 0x00000208375C9280> 来代替我希望它显示的数据

这是我的 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', 'user_dept', 'date', 'category', 'roles', 'responderID', 'severity', 'created_at']
    def user_dept(self, obj):
        return Account.department

我的 models.py 文件包含 Account 模型:

class Account(AbstractBaseUser, PermissionsMixin):
    username        = models.CharField(max_length=150, unique=True)
    email           = models.EmailField(verbose_name='email', max_length=254, unique=True)
    department      = models.CharField(verbose_name='department', max_length=100, editable=True)
    first_name      = models.CharField(verbose_name='first name', max_length=254, blank=True)
    last_name       = models.CharField(verbose_name='last name', max_length=254, blank=True)
    date_joined     = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login      = models.DateTimeField(verbose_name='last login', auto_now=True)
    is_active       = models.BooleanField(default=True)
    is_admin        = models.BooleanField(default=False)
    is_staff        = models.BooleanField(default=False)
    is_superuser    = models.BooleanField(default=False)

如何让它显示部门中的内容?

标签: pythondjango

解决方案


obj是这里的模型对象,您可以通过以下方式呈现它obj.user.department

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', 'user_dept', 'date', 'category', 'roles', 'responderID', 'severity', 'created_at']
    
    def user_dept(self, obj):
        return obj.user.department

.select_related(…)您可以使用子句 [Django-doc]提高效率:

class RiskRegisterAdmin(admin.ModelAdmin):
    # ⋮
    
    def get_queryset(self, request):
        qs = super().get_queryset(request).select_related('user')

推荐阅读