1

例如模型:

类播放器(模型。模型):
    Team = models.ForeignKey(Team)

从效率的角度来看,如果您多次访问玩家的“团队”,将团队存储在临时变量中是否更有效?

这是不是效率较低:

玩家 = Player.objects.get(id=1)
print "玩家是成员" + str(player.team)
player.team.printRoster()

比这个?:

玩家 = Player.objects.get(id=1)
临时=玩家.团队
print "玩家是成员" + str(temp.team)
temp.printRoster()

我觉得答案是否定的,它们都是一样的。但是听过同事的不同反馈,想客观的说一下。

4

2 回答 2

5

在此处指定。

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)

当你这样做时:

player = Player.objects.get(name=u'Messi')
print player.team

您将访问数据库 3 次,一次获取球员,一次获取球队,另一次获取国家/地区名称。如果我没记错的话,下次你做那个“打印”语句时,django 不会再次访问数据库(我可能错了,但我认为它是这样工作的)。

现在想象一下,您想为每个玩家都这样做,并且您有很多玩家。每个玩家要访问数据库 3 次,这可不是什么好事。如果您稍微更改您的查询,您可以对数据库执行相同的操作一次。您可以这样做:

players = Player.objects.all().select_related('team__country')
for player in players:
    print player.team

我希望这可以帮助您了解查询集如何在 Django 上工作。尝试阅读我在此处链接的文档。一个可以帮助您衡量查询效率的优秀工具是django_toolbar。我强烈推荐它。

于 2012-05-30T03:16:46.573 回答
1

Django 为你缓存它,检查代码

您可以通过检查来确保这一点

>>> player.team is player.team
于 2012-05-30T02:40:41.490 回答