问题
我想根据ModelAdmin
的ordering
条件只显示QuerySet
的最后一行。我已经尝试了几种方法,但没有一种方法对我有效。
型号:
class DefaultConfig(models.Model):
created_at = models.DateTimeField()
...
尝试1:
我尝试覆盖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>]
我尝试了[<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中。
有没有更直接的方法来实现这一点呢?
1条答案
按热度按时间ars1skjm1#
是否尝试设置
list_per_page = 1
?从技术上讲,这仍然会返回所有
Config
对象,但每页只返回一个,最新的对象将位于第一页。另一个解决方案(类似于“尝试2”)涉及一个额外的查询,它是手动获取最新的
created_at
时间戳,然后使用它进行过滤。