Как показать только один объект в представлении списка в админке django?
Проблема
Я хочу показать только последний ряд QuerySet
, основываясь на ModelAdmin
критериях ordering
. Я попробовал несколько методов, но ни один из них не сработал.
Модель:
class DefaultConfig(models.Model):
created_at = models.DateTimeField()
...
Попытка 1:
Я попробовал переопределить метод ModelAdmin
get_queryset
и нарезать результат super
, но столкнулся с некоторыми проблемами.
I.E.:
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
искать записи с этим значением. I.E:
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'))
Но, глупый я, это работает на уровне строки, поэтому будет возвращать агрегаты только по самой строке.
Дальнейшие попытки (TBD):
Возможно, ответ кроется в SubQuery
s или Window
ing и rank
ing.
Есть ли более прямой способ добиться этого?
Вы пытались установить list_per_page = 1
?
class DefaultConfigAdmin(models.ModelAdmin):
model = Config
ordering = ('-created_at',)
list_per_page = 1
Технически это по-прежнему будет возвращать все Config
объекты, но только один на страницу, и самый последний будет на первой странице.
Другое решение (похожее на вашу "Попытку 2"), которое включает дополнительный запрос, заключается в том, чтобы вручную получить последнюю временную метку created_at
и затем использовать ее для filetring.
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)