Переводимые поля Manytomany в админке генерируют много запросов

Я использую django-parler (производная от django-hvad) для переводов. В admin при отображении полей Foreignkey с множеством взаимосвязей, django запускает по одному запросу для каждого:

change_clinic__english____django_suit

change_clinic__english____django_suit

Таким образом, при наличии 300 служб будет столько же запросов.

Я думаю, что prefetch_related на get_queryset не относится к mantomany Фильтры / списки, поправьте меня, если я не прав:

def get_queryset(self, request):
    return super(DoctorAdmin, self).get_queryset(request).prefetch_related('translations', 'services__translations')

не влияет на количество запросов. Включение кэширования в обработчике (как предложил автор) также не помогает, поскольку одни и те же запросы не повторяются, но каждый элемент в этих фильтрах вызывается в запросе для переведенных элементов (идентификаторы каждый раз разные). Итак, что я ищу, так это select_related / prefetch_related для внутренних фильтров. Я также покажу ваши приложения, если вы уже решили эту проблему.

2 ответа

Решение

В надежде быть полезным для некоторых других, вот как я решил проблему, уменьшив количество запросов от 2k до 30 в админе:

class MyModelAdminForm(TranslatableModelForm):
    class Meta:
        model = MyModel
        exclude = ()

    def __init__(self, *args, **kwargs):
        super(MyModelAdminForm, self).__init__(*args, **kwargs)
        self.fields['services'].queryset = Service.objects.prefetch_related('translations').all()

class MyModelAdmin(TranslatableAdmin):

    form = MyModelAdminForm

Итак, переопределите форму и, попав внутрь, переопределите набор запросов с помощью prefetch.

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

пытаться:

return super(DoctorAdmin, self).get_queryset(request).prefetch_related( 
    'services__service_translation__translations',
    'services__service_translation__master'
)

Показ файла models.py поможет.

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