Django admin list_display用外键奇怪的慢 [英] Django admin list_display weirdly slow with foreign keys

查看:213
本文介绍了Django admin list_display用外键奇怪的慢的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Django 1.2.5
Python:2.5.5

Django 1.2.5 Python: 2.5.5

我的运动模型的管理列表刚刚走得很慢(400条记录5分钟) 。一秒钟内返回,直到我们有400场比赛,50支球队和2场运动。

My admin list of a sports model has just gone really slow (5 minutes for 400 records). It was returning in a second or so until we got 400 games, 50 odd teams and 2 sports.

我已经修复了一个糟糕的方式,所以我想看看有没有人看过这个。我的应用程序如下所示:

I have fixed it in an awful way so I'd like to see if anyone has seen this before. My app looks like this:

models:

Sport( models.Model )
    name

Venue( models.Model )
    name

Team( models.Model )
    name

Fixture( models.Model )
    date
    sport = models.ForeignKey(Sport)
    venue = models.ForeignKey(Venue)

TeamFixture( Fixture )
    team1 = models.ForeignKey(Team, related_name="Team 1")
    team2 = models.ForeignKey(Team, related_name="Team 2")


admin:

TeamFixture_ModelAdmin (ModelAdmin)
    list_display = ('date','sport','venue','team1','team2',)

如果我从list_display中删除任何外键,那么它很快。一旦我添加任何外键,然后缓慢。

If I remove any foreign keys from list_display then it's quick. As soon as I add any foreign key then slow.

我通过使用非外键来修复它,但是在模型init中计算它,所以这样工作:

I fixed it by using non foreign keys but calculating them in the model init so this works:

models:

TeamFixture( Fixture )
    team1 = models.ForeignKey(Team, related_name="Team 1")
    team2 = models.ForeignKey(Team, related_name="Team 2")
    sport_name = ""
    venue_name = ""
    team1_name = ""
    team2_name = ""

    def __init__(self, *args, **kwargs):
        super(TeamFixture, self).__init__(*args, **kwargs)

        self.sport_name = self.sport.name
        self.venue_name = self.venue.name
        self.team1_name = self.team1.name
        self.team2_name = self.team2.name

admin:

TeamFixture_ModelAdmin (ModelAdmin)
    list_display = ('date','sport_name','venue_name','team1_name','team2_name',)

所有其他型号的管理现在几千条记录是正常的,实际网站中的所有视图都正常运行。

Administration for all other models are fine with several thousand records at the moment and all views in the actual site is functioning fine.

推荐答案

这让我很疯狂。 list_select_related设置为True,但是在list_display中向User添加外键会在admin中为每行生成一个查询,这使得列表缓慢。 Select_related为True,所以Django管理员不应该在每行上调用此查询。
发生了什么?

It's driving me crazy. list_select_related is set to True, however adding a foreign key to User in the list_display generates one query per row in the admin, which makes the listing slow. Select_related is True, so the Django admin shouldn't call this query on each row. What is going on ?

这篇关于Django admin list_display用外键奇怪的慢的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆