Django Admin 选择单个记录超慢

Hen*_*ryM 5 django django-models django-admin

我有Pick一个模型,当我在 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)
Run Code Online (Sandbox Code Playgroud)

我怎样才能提高这里的性能?

bdo*_*leu 4

关键是raw_id_fields在管理类上指定。外键关系的默认<select>小部件可能会导致检索和呈现所有选项的大量开销。

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')
Run Code Online (Sandbox Code Playgroud)