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必须获取所有数据,即使查询速度很快,也需要很长时间才能呈现模板。尝试将其添加到管理中,如编辑中所示,但现在在相关详细信息页面上的速度较慢