我正在使用django-parler(django-hvad的衍生物)进行翻译。在admin中显示具有多个关系的Foreignkey字段时,django为每个字段运行一个查询:
因此,当有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。如果您已经解决了这个问题,我也会同时审核您的应用程序。
答案 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文件会有所帮助。