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

时间:2015-04-17 07:41:42

标签: python django django-admin django-hvad django-parler

我正在使用django-parler(django-hvad的衍生物)进行翻译。在admin中显示具有多个关系的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')

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

2 个答案:

答案 0 :(得分:5)

希望对其他人有用,以下是我解决问题的方法,将管理员的查询从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覆盖查询集。

答案 1 :(得分:1)

看起来你在多对多表中使用双下划线,它应该是一个下划线。还可以尝试在主表中添加

尝试:

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

显示models.py文件会有所帮助。