Как отобразить значение в другой таблице с помощью функции в 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)
Как сделать так, чтобы он отображал то, что находится в отделе?
Здесь 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')