4

我正在使用 django-parler(django-hvad 的衍生产品)进行翻译。在管理中显示具有多对多关系的外键字段时,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 上启用缓存(正如作者在此处建议的那样)也无济于事,因为不会重复相同的查询,但在查询已翻译项目时会调用这些过滤器上的每个项目(ID 每次都不同)。所以,我正在寻找的是内部过滤器上的 select_related/prefetch_related 。同时,我还将审查您的应用程序,以防您已经解决了此类问题。

4

2 回答 2

6

In the hope of being useful for some others, here is how I solved the problem, reducing the queries from 2k to 30 in the admin:

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

So, override the form, and once inside, override the queryset with prefetch.

于 2015-04-17T15:34:22.007 回答
1

看起来您正在为多对多表使用双下划线,而它应该是单个下划线。也尝试在主表中添加

尝试 :

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

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

于 2015-04-17T11:09:29.090 回答