admin中的可翻译Manytomany字段会生成许多查询

Dan*_* Tz 4 python django django-admin django-hvad django-parler

我正在使用django-parler(django-hvad的衍生物)进行翻译.在管理员显示具有多种关系的Foreignkey字段时,django为每个字段运行一个查询:

change_clinic__english____django_suit

change_clinic__english____django_suit

因此,当有300个服务时,会有尽可能多的查询.

我认为get_queryset上的prefetch_related不适用于mantomany过滤器/列表,如果我错了,请纠正我:

def get_queryset(self, request):
    return super(DoctorAdmin, self).get_queryset(request).prefetch_related('translations', 'services__translations')
Run Code Online (Sandbox Code Playgroud)

对查询数量没有影响.启用缓存上parler(如笔者建议在这里)也于事无补,因为相同的查询不重复,但这些过滤器的每一项被称为在翻译项目查询(IDS每一次都是不同的).所以,我要找的是内部过滤器上的select_related/prefetch_related.如果您已经解决了这个问题,我也会同时审核您的应用程序.

Dan*_* Tz 5

为了对其他人有用,这里是我解决问题的方法,在admin中将查询从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
Run Code Online (Sandbox Code Playgroud)

因此,覆盖表单,并在内部后,使用prefetch覆盖查询集.