管理中的可翻译Manytomany字段会生成许多查询 [英] Translatable Manytomany fields in admin generate many queries

查看:197
本文介绍了管理中的可翻译Manytomany字段会生成许多查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用django-parler(django-hvad的衍生物)进行翻译。在管理员显示具有manytomany关系的Foreignkey字段时,django为每个字段运行单个查询:







所以当有300个服务会有我认为get_queryset上的prefetch_related不适用于 mantomany 过滤器/列表,更正了我的意思。



如果我错了:

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

对查询数量没有影响。启用缓存缓存(作者作者建议 here )也没有帮助,因为相同的查询不会重复,而是在一个查询中调用这些过滤器上的每个项目(每次ID都不同)。所以,我正在寻找的是一个关于内部过滤器的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

该表单和一次内部覆盖使用预取来覆盖查询。


I am using django-parler (a derivative of django-hvad) for translations. In admin when displaying Foreignkey fields with manytomany relationship, django runs a single query for each:

So when there are 300 services there would be as many queries.

I think the prefetch_related on get_queryset doesn't apply to mantomany filters/lists, correct me if I am wrong:

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

has no effect on number of queries. Enabling caching on parler (as the author suggested here) also does not help since the same queries are not repeated but each item on those filters is called in a query for translated items (IDs are different each time). So, what I am looking for is a select_related/prefetch_related on inner filters. I will also review your apps meanwhile, in case you have solved such problem already.

解决方案

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.

这篇关于管理中的可翻译Manytomany字段会生成许多查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆