Аннотируйте список Django ModelAdmin без аннотирования запроса

Поэтому в течение долгого времени я делал аннотации в ModelAdmins для добавления сложных чисел и связанных с ними полей в списки администратора. Вот простой пример подсчета.

class MyClassAdmin(admin.ModelAdmin):
    list_display [ .. 'capacity', ..]

    def get_queryset(self, request):
        return super(MyClassAdmin, self).get_queryset(request).annotate(
            capacity=Count('spaces')
        )

    def capacity(self, obj):
        return obj.capacity

На практике я делаю четыре или пять на некоторых ModelAdmins. Запрос медленнее, чем запрос на акции, но он быстрее, чем выполнение запросов 1+100, так как связанные данные извлекаются.

Тем не менее, Django делает запрос на подсчет в списках. Под столом вы увидите xxx modelnames сообщение. Это генерируется из того же аннотированного запроса. Проверено с помощью Django Debug Toolbar. Я обнаружил, что в некоторых случаях любое сохранение от уменьшения количества запросов теряется для более сложного запроса подсчета.

Я знаю, переопределение get_queryset позволяет фильтровать данные, но я не так их использую. Есть ли что-то лучшее, что я могу переопределить, что позволяет счетчику проходить без аннотации, но позволяет мне аннотировать отображение списка?

0 ответов

Другие вопросы по тегам