Mik*_*keN 1 django performance django-models
例如型号:
class Player(models.Model): Team = models.ForeignKey(Team)
从效率的角度来看,如果您多次访问玩家的"团队",将团队存储在临时变量中会更有效吗?
效率低下:
player = Player.objects.get(id=1) print "Player is a member of " + str(player.team) player.team.printRoster()
比这个?:
player = Player.objects.get(id=1) temp = player.team print "Player is a member of " + str(temp.team) temp.printRoster()
我觉得答案是否定的,它们都是一样的.但是从同事那里听到了不同的反馈,并希望得到一个客观的观点.
它在这里指定.
Django为您缓存它.问题是你将如何处理这些"外键"引用.例如,如果您有一个模型的外键,其unicode方法访问另一个外键以打印"友好"的unicode字符串,根据您创建查询集的方式,您可能会再次访问数据库.
让我举个例子来澄清一下:
class Player(models.Model):
pname = models.CharField(max_length=20)
team = models.ForeignKey('Team')
class Team(models.Model):
tname = models.CharField(max_length=20)
country = models.ForeignKey('Country')
def __unicode__(self):
return self.tname + u' is from ' + self.country.cname
class Country(models.Model):
cname = models.CharField(max_length=10)
Run Code Online (Sandbox Code Playgroud)
当你这样做:
player = Player.objects.get(name=u'Messi')
print player.team
Run Code Online (Sandbox Code Playgroud)
你会三次点击数据库,一个是获取玩家,一个是获得团队,另一个是获取国家名称.如果我没有错,下次你做那个"打印"声明时,django就不会再次打到数据库了(我可能错了,但我认为它的工作原理是这样的).
现在想象一下,你想为每个玩家做这件事,你有很多.你将打算每个玩家三次打到数据库,这可能不是很好.如果稍微更改一下您的查询,您可以只执行一次命中数据库.这是你如何做到的:
players = Player.objects.all().select_related('team__country')
for player in players:
print player.team
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助您了解查询集如何在Django上运行.尝试阅读我在此处链接的文档.一个可以帮助您测量查询效率的优秀工具是django_toolbar.我强烈推荐它.
归档时间: |
|
查看次数: |
1152 次 |
最近记录: |