Dan*_* Tz 4 python django django-admin django-hvad django-parler
我正在使用django-parler(django-hvad的衍生物)进行翻译.在管理员显示具有多种关系的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')
Run Code Online (Sandbox Code Playgroud)
对查询数量没有影响.启用缓存上parler(如笔者建议在这里)也于事无补,因为相同的查询不重复,但这些过滤器的每一项被称为在翻译项目查询(IDS每一次都是不同的).所以,我要找的是内部过滤器上的select_related/prefetch_related.如果您已经解决了这个问题,我也会同时审核您的应用程序.
为了对其他人有用,这里是我解决问题的方法,在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覆盖查询集.
| 归档时间: |
|
| 查看次数: |
1247 次 |
| 最近记录: |