如何在Django Admin中通过Personne筛选Project(多对一场景)
在Django Admin的Project列表页添加Personne筛选框
因为Project和Personne是通过Task表间接关联的(没有直接外键),所以得自定义筛选类来实现需求,具体步骤如下:
1. 编写自定义筛选类
在你的admin.py文件里加上这段代码:
from django.contrib import admin from django.contrib.admin import SimpleListFilter from .models import Project, Personne, Task class PersonneFilter(SimpleListFilter): title = '关联人员' # 筛选框显示的标题 parameter_name = 'personne' # 筛选时URL里用的参数名 def lookups(self, request, model_admin): # 生成下拉选项,把所有Personne的ID和名称对应起来 return [(p.id, p.name) for p in Personne.objects.all()] def queryset(self, request, queryset): # 根据选中的人员过滤Project列表 selected_personne_id = self.value() if selected_personne_id: # 找到该人员关联的所有Task,再提取对应的Project ID related_project_ids = Task.objects.filter( personnetask_id=selected_personne_id ).values_list('projecttasktask_id', flat=True) # 返回这些ID对应的Project return queryset.filter(id__in=related_project_ids) # 如果没选,返回全部Project return queryset
2. 更新ProjectAdmin的配置
把自定义的筛选类加到list_filter里:
@admin.register(Project) class ProjectAdmin(admin.ModelAdmin): # 可选:把title和note显示在列表页,方便查看 list_display = ('title', 'note') # 添加我们自定义的Personne筛选 list_filter = [PersonneFilter]
这样配置后,你在Admin的Project列表页就能看到“关联人员”的下拉筛选框,选一个Personne,就会显示所有该人员通过Task关联的Project了。
内容的提问来源于stack exchange,提问作者AMINOS
相关产品推荐
相关产品推荐

