Переводимые поля Manytomany в админке генерируют много запросов
Я использую django-parler (производная от django-hvad) для переводов. В admin при отображении полей Foreignkey с множеством взаимосвязей, django запускает по одному запросу для каждого:
Таким образом, при наличии 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 поможет.