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

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

我正在使用 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 上启用缓存(正如作者建议的 here )也无济于事,因为不会重复相同的查询,但这些过滤器上的每个项目都会在对已翻译项目的查询中调用(每次 ID 都不同)。所以,我正在寻找的是内部过滤器上的 select_related/prefetch_related。我也会同时审查您的应用,以防您已经解决了此类问题。

最佳答案

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

因此,覆盖表单,一旦进入内部,使用预取覆盖查询集。

关于python - 管理中的可翻译 Manytomany 字段生成许多查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29693186/

相关文章:

Django 管理网址

python - 按对角线旋转数据框

python - 如何在 Python 中创建列表列表

python - 在Python中使用二维列表的逻辑索引

Django 和 celery : Tasks not imported

Django - 使用模板标签和 'with' 吗?

python - django admin - 计算字符数并在有限的文本字段中显示剩余空间

javascript - Django 管理员 : Alter how data is displayed

python - 在 Django-rest-framework 中编写一个可以访问 validatated_data 的验证器类

python - Django q 更新一个已经安排好的任务