You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:50:23