如何在django管理列表视图中只显示一个对象?

iqxoj9l9  于 2022-11-19  发布在  Go
关注(0)|答案(1)|浏览(128)

问题
我想根据ModelAdminordering条件只显示QuerySet的最后一行。我已经尝试了几种方法,但没有一种方法对我有效。

型号:
class DefaultConfig(models.Model):
    created_at = models.DateTimeField()
    ...
尝试1:

我尝试覆盖ModelAdminget_queryset方法并对super的结果进行切片,但遇到了一些问题。
一、工程师:

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

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

我尝试了[<slice>] s的以下值:

  • [-1:]:由于不支持负切片,因此引发异常
  • [:1]:凸起的AssertionError: Cannot reorder a query once a slice has been taken.
尝试2:

我尝试获取created_at,然后使用filter查找具有该值的记录。例如:

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'))

但是我很傻,这是在行级别上工作的,所以它只返回行本身的聚合。

进一步尝试(待定):

也许答案就在SubQuery s或Window ing和rank ing中。
有没有更直接的方法来实现这一点呢?

ars1skjm

ars1skjm1#

是否尝试设置list_per_page = 1

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

从技术上讲,这仍然会返回所有Config对象,但每页只返回一个,最新的对象将位于第一页。
另一个解决方案(类似于“尝试2”)涉及一个额外的查询,它是手动获取最新的created_at时间戳,然后使用它进行过滤。

class DefaultConfigAdmin(models.ModelAdmin):
    model = Config

    def get_queryset(self, request):
         qs = super().get_queryset(request)
         latest_config = qs.order_by('created_at').last()
         return qs.filter(created_at=latest_config.created_at)

相关问题