Django Admin多对多字段仅显示已选选项的实现方法
Django Admin 优化 Collection 关联 CustomObject 显示方案
核心优化方向
因为业务上只需要查看已选的CustomObject,选/取消操作完全由定时任务处理,所以从两点入手解决加载慢的问题:
- 过滤关联字段的查询集,只展示当前Collection已绑定的CustomObject
- 把关联字段设为只读,避免加载大量选项的表单控件
完整 Admin 代码实现
from django.contrib import admin from .models import Collection, CustomObject class CollectionAdmin(admin.ModelAdmin): search_fields = ['name', 'id'] # 将关联字段设为只读,直接展示已选内容,不渲染多选控件 readonly_fields = ['custom_objects'] def formfield_for_manytomany(self, db_field, request, **kwargs): # 只处理custom_objects这个多对多字段 if db_field.name == 'custom_objects': # 获取当前正在编辑的Collection实例ID obj_id = request.resolver_match.kwargs.get('object_id') if obj_id: # 过滤出当前Collection已关联的所有CustomObject kwargs["queryset"] = CustomObject.objects.filter(collection__id=obj_id) else: # 新增页面直接返回空查询集(毕竟关联操作由定时任务做) kwargs["queryset"] = CustomObject.objects.none() return super().formfield_for_manytomany(db_field, request, **kwargs) admin.site.register(Collection, CollectionAdmin) admin.site.register(CustomObject)
效果说明
- 进入Collection编辑页时,
custom_objects只会显示当前实例绑定的10-20条数据,不会加载全部2万+条,页面加载速度大幅提升 - 只读设置彻底避免了加载臃肿的多选控件,同时也符合“仅查看不操作”的业务要求
- 新增Collection页面时,该字段显示为空,完全适配定时任务处理关联的逻辑
内容的提问来源于stack exchange,提问作者Bamberino
相关产品推荐
相关产品推荐

