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

如何在Django Admin列表视图中仅显示最后一条数据?

问题:Django Admin列表仅显示QuerySet最后一行数据

希望基于ModelAdmin的ordering规则,在Django Admin列表视图中仅显示QuerySet的最后一行数据,尝试多种方法均未成功。

模型定义

class DefaultConfig(models.Model):
    created_at = models.DateTimeField()
    ...

已尝试方法

尝试1:重写get_queryset并切片

重写ModelAdmin的get_queryset方法,对super()返回的结果进行切片,但遇到问题:

class DefaultConfigAdmin(models.ModelAdmin):
    model = Config
    ordering = ('-created_at',)

    def get_queryset(self, request):
         qs = super().get_queryset(request)
         return qs[<slice>]

尝试的切片参数:

  • [-1:]:抛出异常,Django QuerySet不支持负向切片
  • [:1]:抛出AssertionError: Cannot reorder a query once a slice has been taken.

尝试2:聚合筛选最大值

尝试获取created_at的最大值,再筛选对应记录,但该方法仅针对单行聚合,无法得到预期结果:

class DefaultConfigAdmin(models.ModelAdmin):
    model = Config

    def get_queryset(self, request):
         qs = super().get_queryset(request)
         return qs.annotate(max_created_at=Max('created_at')).filter(created_at=F('max_created_at'))

可行解决方案

方案1:利用latest()结合QuerySet包装

基于ordering规则获取最后一条记录,再包装成QuerySet返回,避免Admin报错:

class DefaultConfigAdmin(models.ModelAdmin):
    model = Config
    ordering = ('-created_at',)

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        try:
            # 基于ordering规则获取最后一条,也可显式指定字段如latest('created_at')
            latest_obj = qs.latest()
            return qs.filter(pk=latest_obj.pk)
        except Config.DoesNotExist:
            return qs.none()

方案2:SubQuery子查询筛选

用子查询获取最新的created_at值,适合存在多条同时间记录的场景:

from django.db.models import SubQuery, OuterRef

class DefaultConfigAdmin(models.ModelAdmin):
    model = Config
    ordering = ('-created_at',)

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        # 子查询获取最大的created_at
        max_created_subq = qs.values('created_at').order_by('-created_at')[:1]
        return qs.filter(created_at=SubQuery(max_created_subq))

方案3:手动指定排序后切片

清除QuerySet原有排序,手动指定排序后取第一条:

class DefaultConfigAdmin(models.ModelAdmin):
    model = Config
    ordering = ('-created_at',)

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        # 手动指定排序后切片,避免排序冲突
        return qs.order_by('-created_at')[:1]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:45:37