Django - 加载多对多关系管理页面太慢了

Django - Loading Many-To-Many relationship admin page is so slow

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

我不知道如何在这里使用 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

如果您还想使用limit_choices_to,那么请参考docs。您基本上只需在字典对象中提供过滤器。

为了加快管理速度,我的建议包括:
1. 在您的 ModelAdmin 中使用 raw_id_fields。这为您提供了一个小搜索框而不是选择框,并避免了列出所有相关对象的开销。
2. 如果你正在处理前向外键关系,你可以像下面的代码一样使用list_select_related in your ModelAdmin as well. In your case, you are handling many-to-many relationships, so you can try overriding the get_queryset method of the ModelAdmin, and use 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。