Как показать только один объект в представлении списка в админке 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):

Возможно, ответ кроется в SubQuerys или Windowing и ranking.

Есть ли более прямой способ добиться этого?

Вы пытались установить 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)
Вернуться на верх