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

标签 django admin

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

我不确定如何在此处使用 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.如果要处理向前的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的内容。

关于Django-加载多对多关系管理页面太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31459078/

相关文章:

python - 在Django项目中获取typeError错误

python - Django websockets 实现

admin - Prestashop:如何以管理员身份更改我的页面标题

Java:以管理员身份运行

python - Django对象扩展/一对一关系问题

php - 共享主机上的 403 Forbidden Laravel

python - 未提供异常消息(Django REST POST)

Django CSRF_COOKIE_DOMAIN - 如何优雅地改变

python - value_list() 可以返回名称而不是 id 吗?

css - 如何更改 Magento 中的管理标题颜色?