(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
答案 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的内容。