Django - 加载多对多关系管理页面是如此之慢

时间:2015-07-16 15:55:27

标签: django admin

(Django 1.8)我有一个与其他表有4对多关系的表。 其中两个表有很多条目,导致管理页面加载速度非常慢,因为它试图加载列表中的所有条目。 有没有办法避免内部管理页面查询加载大表的所有条目,以加快管理页面加载? 我认为最好的方法是仅列出选定的值,但我不确定如何。

我不确定如何在这里使用 limit_choices_to

class Data(models.Model):
    pass # stuff here

class Report(models.Model):
    data= models.ManyToManyField(Data)

我也尝试将其添加到我的admin.py中,但它根本没用。它不是出于某种原因限制:

def queryset(self, request):
    qs = super(MyModelAdmin, self).queryset(request)
    if len(qs) > 10:
        qs = qs[:10]
    return qs

1 个答案:

答案 0 :(得分:7)

如果您仍想使用limit_choices_to,请参阅docs。你基本上只是在字典对象中提供过滤器。

为了加快管理员的速度,我的建议包括:
1.在ModelAdmin中使用raw_id_fields。这为您提供了一个小搜索框而不是选择框,并避免了列出所有相关对象的开销 2.如果您正在处理向前的ForeignKey关系,您也可以在ModelAdmin中使用list_select_related。在您的情况下,您正在处理多对多关系,因此您可以尝试覆盖ModelAdmin的get_queryset方法,并在下面的代码中使用prefetch_related

from django.contrib import admin

class TestModelAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        test_model_qs = super(TestModelAdmin, self).get_queryset(request)
        test_model_qs = test_model_qs.prefetch_related('many-to-many-field')
        return test_model_qs

如果您真的想亲自动手,我强烈建议您使用django-debug-toolbar。它确实让您可以查看正在运行的SQL语句的数量和内容。如果您可以阅读SQL,则可以推断出需要输入select_related和prefetch_related的内容。