Администратор Django: ModelAdmin с внешним ключом для пользователя добавляет один запрос на строку - PullRequest
3 голосов
/ 13 августа 2011

У меня проблема с администратором Django: я создал производный класс ModelAdmin.Этот класс имеет атрибут list_select_related, установленный в True.

Если я добавлю поле внешнего ключа в модель User в list_display, что бы я ни делал, каждая отображаемая строка добавляет запрос в следующей форме:

SELECT `auth_user`.`id`, `auth_user`.`username`, `auth_user`.`first_name`, `auth_user`.`last_name`, `auth_user`.`email`, `auth_user`.`password`, `auth_user`.`is_staff`, `auth_user`.`is_active`, `auth_user`.`is_superuser`, `auth_user`.`last_login`, `auth_user`.`date_joined`, `auth_user`.`picture_id` FROM `auth_user` WHERE `auth_user`.`id` = 1

Это делает администратора довольно медленно, что происходит?Заранее спасибо.

1 Ответ

1 голос
/ 13 августа 2011

Хорошо, мне удалось решить проблему.Вы должны быть очень конкретны в своем коде.Вы должны переопределить ModelAdmin.queryset таким образом, чтобы предотвратить запуск этих лишних бесполезных запросов.Количество запросов уменьшилось с 286 до 7 (для страницы из 100 элементов).

Редактирование ModelAdmin.queryset

class MyModelAdmin(ModelAdmin):
    def queryset(self, request):
        qs = super(AccessAdmin, self).queryset(request)
        qs = qs.select_related('user','ip','user__picture').only('user__username','path','referrer','ip__id','ip__string','ip__country','time','user__id','id','ip__ip','user__picture','user__picture__id','user__picture__image')
        return qs

Вам нужно будет тщательно выбирать поля и внешние ключи.,Если вам интересно, поле user.picture было добавлено с помощью метода Model.add_to_class.

...