如何在Django Admin中使用自定义模型属性作为搜索字段
Django Admin 自定义property字段搜索解决方案
你的问题核心在于Python层面的@property属性不存在于数据库中,无法直接用于ORM过滤,同时不可直接将Python列表与QuerySet对象拼接。以下是两种可行的实现方案:
方案一:数据库层面字段拼接(推荐,性能更高)
直接使用Django ORM提供的数据库函数在查询时拼接字段,全程走SQL查询,无需拉取全表数据在Python层循环:
- 首先导入依赖的ORM函数:
from django.db.models import Value, CharField, Concat # 如果lab_number为数字类型,额外导入Cast from django.db.models import Cast
- 修改
get_search_results方法:
class SpecimenModelAdmin(admin.ModelAdmin): search_fields = ('patient_name', 'lab_number', 'specimen_type') def get_search_results(self, request, queryset, search_term): # 先获取原生单个字段匹配的结果 original_queryset, may_have_duplicates = super().get_search_results( request, queryset, search_term, ) if not search_term: return original_queryset, may_have_duplicates # 数据库层面生成和@property逻辑一致的拼接字段 # 如果lab_number是数字类型,替换下方的'lab_number'为Cast('lab_number', output_field=CharField()) queryset_with_name = queryset.annotate( specimen_name=Concat( 'lab_number', Value('_'), 'patient_name', Value('_'), 'specimen_type', output_field=CharField() ) ) # 过滤拼接字段匹配搜索词的结果 name_matched_queryset = queryset_with_name.filter( specimen_name__icontains=search_term ) # 合并结果去重,返回合法QuerySet final_queryset = original_queryset | name_matched_queryset return final_queryset.distinct(), True
方案二:Python层过滤(仅适合小表、property逻辑无法用数据库函数实现的场景)
如果你的specimen_name计算逻辑非常复杂,无法用数据库函数复现,可以先循环匹配拿到符合条件的主键,再用主键过滤得到合法QuerySet:
class SpecimenModelAdmin(admin.ModelAdmin): search_fields = ('patient_name', 'lab_number', 'specimen_type') def get_search_results(self, request, queryset, search_term): original_queryset, may_have_duplicates = super().get_search_results( request, queryset, search_term, ) if not search_term: return original_queryset, may_have_duplicates # 循环匹配拿到符合条件的记录ID matched_ids = [] for item in queryset.all(): if search_term in item.specimen_name: matched_ids.append(item.id) # 用ID过滤得到合法QuerySet name_matched_queryset = queryset.filter(id__in=matched_ids) final_queryset = original_queryset | name_matched_queryset return final_queryset.distinct(), True
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

