Django管理超慢速选择单记录
我有一个Django管理超慢速选择单记录,django,django-models,django-admin,Django,Django Models,Django Admin,我有一个Pickmodel,当我在Django Admin中选择一条记录时,它需要一段时间(大约20秒)来检索该记录(大约有70k条记录)。但是,当我尝试创建/保存记录时,速度很快。我添加了索引以尝试加快检索速度,但我真的不知道应该做什么 class Pick (models.Model): team = models.ForeignKey(Team, on_delete=models.CASCADE, null=True, blank=True) user = models.F
Pick
model,当我在Django Admin中选择一条记录时,它需要一段时间(大约20秒)来检索该记录(大约有70k条记录)。但是,当我尝试创建/保存记录时,速度很快。我添加了索引以尝试加快检索速度,但我真的不知道应该做什么
class Pick (models.Model):
team = models.ForeignKey(Team, on_delete=models.CASCADE, null=True, blank=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, db_index=True)
contest_entry=models.ForeignKey(ContestEntry, on_delete=models.CASCADE, db_index=True)
game_round=models.ForeignKey(GameRound, on_delete=models.CASCADE, db_index=True)
objects = DataFrameManager()
def __str__(self):
return f'%s %s' % (self.contest_entry, self.game_round)
class Meta:
unique_together = ['user', 'contest_entry', 'game_round']
ordering = ['contest_entry','game_round','user','team']
index_together = [["user", "contest_entry", 'game_round'],]
indexes = [
models.Index(fields=['user', 'contest_entry', 'game_round']),
models.Index(fields=['game_round'], name='game_round_idx'),
models.Index(fields=['contest_entry'], name='contest_entry_idx'),
]
class PickAdmin(admin.ModelAdmin):
model = Pick
list_filter= (
('user', RelatedDropdownFilter),
('contest_entry__contest', RelatedDropdownFilter),
('game_round', RelatedDropdownFilter)
)
def get_queryset(self, request):
return super().get_queryset(request).select_related('user','contest_entry','game_round')
admin.site.register(Pick, PickAdmin)
如何在这里提高性能?我的猜测是,渲染模型的
ForeignKey
字段的下拉列表需要很长时间
我建议通过安装Django toolbar或在数据库服务器中启用日志记录来查看执行的SQL查询。您可以使用select_related for ForeignKey来改进查询。该键在admin类上指定了。外键关系的默认
小部件可能会导致检索和呈现所有选项的大量开销
class PickAdmin(admin.ModelAdmin):
model = Pick
list_filter= (
('user', RelatedDropdownFilter),
('contest_entry__contest', RelatedDropdownFilter),
('game_round', RelatedDropdownFilter)
)
raw_id_fields = ('user', 'contest_entry', 'game_round',)
def get_queryset(self, request):
return super().get_queryset(request).select_related('user','contest_entry','game_round')
需要时间的不是包含下拉列表的页面。当我从剩余的可用列表中选择一个项目时,例如,我可能正在调用
https://example.com/admin/contests/pick/1013/change
。此页面没有过滤器-我的意思是,它只是模型的更改页面Pick
。“更改/详细信息”页面上的下拉列表,您可以在其中选择用户、竞赛项目和游戏回合。Django必须获取所有数据,即使查询速度很快,也需要很长时间才能呈现模板。尝试将其添加到管理中,如编辑中所示,但现在在相关详细信息页面上的速度较慢