Django admin list_display用外键奇怪的慢 [英] Django admin list_display weirdly slow with foreign keys
问题描述
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屋!