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

在Django Admin中按ID分组显示最新记录及默认过滤器实现问询

Django Admin 实现按ID分组显示最新实体并默认应用

完全可以实现这个需求,下面分两种场景给出具体实现方案:

一、默认仅显示每个分组的最新实体(无切换选项)

直接重写Admin类的get_queryset方法,过滤出每个分组下datetime最新的记录:

假设你的模型定义如下(这里把分组用的ID命名为group_id,你可以替换成实际字段名):

from django.db import models

class YourModel(models.Model):
    group_id = models.IntegerField(verbose_name="分组ID")
    datetime = models.DateTimeField(verbose_name="时间")
    # 其他业务字段

对应的Admin代码:

from django.contrib import admin
from django.db.models import Subquery, OuterRef
from .models import YourModel

class YourModelAdmin(admin.ModelAdmin):
    list_display = ('group_id', 'datetime', '其他字段')  # 替换成你的实际字段

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        # 子查询:获取每个group_id对应的最新时间
        latest_datetimes = YourModel.objects.filter(
            group_id=OuterRef('group_id')
        ).values('group_id').annotate(
            latest_dt=models.Max('datetime')
        ).values('latest_dt')
        
        # 过滤出每个分组中时间等于最新时间的记录
        return qs.filter(datetime__in=Subquery(latest_datetimes))

admin.site.register(YourModel, YourModelAdmin)

注意:

如果同一分组下存在多条记录时间完全相同,上述代码会显示所有这些记录。如果要强制每个分组只显示一条(比如取ID最大的那条),可以修改子查询逻辑:

# 子查询:获取每个group_id下最新时间且ID最大的记录ID
latest_record_ids = YourModel.objects.filter(
    group_id=OuterRef('group_id')
).order_by('-datetime', '-id').values('id')[:1]

return qs.filter(id__in=Subquery(latest_record_ids))

二、保留切换选项,默认应用“仅显示最新”过滤

如果需要让用户可以选择查看全部记录或仅看最新记录,同时默认选中“仅显示最新”,可以自定义Admin过滤器:

1. 自定义过滤器类

from django.contrib.admin import SimpleListFilter

class LatestRecordFilter(SimpleListFilter):
    title = '显示模式'
    parameter_name = 'show_latest'

    def lookups(self, request, model_admin):
        return (
            ('yes', '仅显示每个分组最新记录'),
            ('no', '显示全部记录'),
        )

    def queryset(self, request, queryset):
        # 默认应用“仅显示最新”逻辑
        if self.value() == 'yes' or self.value() is None:
            latest_record_ids = YourModel.objects.filter(
                group_id=OuterRef('group_id')
            ).order_by('-datetime', '-id').values('id')[:1]
            return queryset.filter(id__in=Subquery(latest_record_ids))
        elif self.value() == 'no':
            return queryset

2. 在Admin中注册过滤器

class YourModelAdmin(admin.ModelAdmin):
    list_display = ('group_id', 'datetime', '其他字段')
    list_filter = (LatestRecordFilter,)  # 添加自定义过滤器

admin.site.register(YourModel, YourModelAdmin)

这样进入Admin列表页时,默认会显示每个分组的最新记录,用户也可以通过过滤器切换到显示全部数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:10:35