如何在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
相关产品推荐
相关产品推荐

