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

max*_*max 6 django admin

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

我不知道如何在这里使用limit_choices_to:

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

class Report(models.Model):
    data= models.ManyToManyField(Data)
Run Code Online (Sandbox Code Playgroud)

我也尝试将此添加到我的admin.py但它根本没有帮助.出于某种原因,这不是限制性的:

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

Wan*_*der 8

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

要加快管理,我的建议包括:
1.使用raw_id_fields在你的ModelAdmin.这为您提供了一个小搜索框而不是选择框,并避免了列出所有相关对象的开销.
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
Run Code Online (Sandbox Code Playgroud)

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