管理中可翻译的许多字段生成许多查询

2024-10-01 09:41:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用django parler(django-hvad的派生)进行翻译。在admin中,当显示具有manytomy关系的Foreignkey字段时,django将为每个字段运行一个查询:

change_clinic__english____django_suit

change_clinic__english____django_suit

所以当有300个服务时,会有同样多的查询。在

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

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

对查询数没有影响。在parler上启用缓存(正如作者建议的here)也无济于事,因为相同的查询不会重复,但这些过滤器上的每个项目都会在翻译项目的查询中调用(每次ID都不同)。所以,我要找的是一个与内部过滤器相关的选择/预取相关的。同时我也会检查你的应用程序,以防你已经解决了这样的问题。在


Tags: 项目djangoself过滤器getadmin关系request
2条回答

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

尝试:

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

显示模型.py文件会有帮助的。在

为了对其他人有所帮助,下面是我如何解决问题的方法,在管理中将查询从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

因此,重写表单,一旦进入表单,就用预取覆盖queryset。在

相关问题 更多 >