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

Django Admin如何按ticker与date字段分组并跳转对应详情列表

解决方案

完全可以实现,无需新增额外模型,仅需修改IncomeStatementQuarterlyAdmin的逻辑即可,核心思路是:无过滤参数时展示去重后的ticker+date分组链接,点击跳转携带过滤参数的原生Admin列表页,自动筛选对应分组下的所有数据行。

完整修改后的admin.py代码

from django.contrib import admin
from django.urls import reverse
from django.utils.html import format_html
from .models import IncomeStatementQuarterly

@admin.register(IncomeStatementQuarterly)
class IncomeStatementQuarterlyAdmin(admin.ModelAdmin):
    search_fields = ['ticker']
    list_display_links = ('ticker',)

    # 自定义分组链接列
    def statement_group(self, obj):
        # 注意将下方your_app_name替换为你的Django应用实际名称
        base_url = reverse('admin:your_app_name_incomestatementquarterly_changelist')
        # 兼容字典(去重查询结果)和模型实例两种返回格式
        ticker = obj['ticker'] if isinstance(obj, dict) else obj.ticker
        date_val = obj['date'] if isinstance(obj, dict) else obj.date
        # 拼接过滤参数
        filter_params = f'?ticker={ticker}&date={date_val}'
        return format_html('<a href="{}">{} | {}</a>', 
                          base_url + filter_params, 
                          ticker, 
                          date_val.strftime('%b %d, %Y'))
    statement_group.short_description = '财报分组'

    # 根据是否有过滤参数动态返回展示列
    def get_list_display(self, request):
        if request.GET.get('ticker') or request.GET.get('date'):
            return ("ticker", "date", "statement", "line_item", 'amount')
        return ('statement_group',)

    # 根据是否有过滤参数动态返回查询集
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        # 无过滤参数时返回去重的ticker+date组合
        if not request.GET.get('ticker') and not request.GET.get('date'):
            return qs.values('ticker', 'date').distinct().order_by('ticker', 'date')
        return qs

    # 根据是否有过滤参数动态返回过滤器
    def get_list_filter(self, request):
        if request.GET.get('ticker') or request.GET.get('date'):
            return ('line_item',)
        return []

    # 根据是否有过滤参数动态返回日期层级导航
    def get_date_hierarchy(self, request):
        if request.GET.get('ticker') or request.GET.get('date'):
            return 'date'
        return None

    def has_add_permission(self, request, obj=None):
        return False

    def has_delete_permission(self, request, obj=None):
        return False

    def has_change_permission(self, request, obj=None) -> bool:
        return False

注意事项

  • 请将代码中your_app_name替换为你当前注册IncomeStatementQuarterly模型的Django应用名称
  • 如果日期过滤不生效,可以将参数date替换为date__date适配不同数据库的日期字段匹配规则
  • 该方案完全复用Django Admin原生的过滤、搜索、分页能力,无需额外开发模板或视图

内容的提问来源于stack exchange,提问作者Paul Marmagne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:54:03