【发布时间】:2020-09-22 19:39:48
【问题描述】:
请参考这些示例模型:
class Player(models.Model):
team = models.ForeignKey(Team, on_delete=models.CASCADE)
class Team(models.Model):
captain = models.ForeignKey(Manager, on_delete=models.CASCADE)
country = models.CharField()
class Manager(models.Model):
networth = models.FloatField()
我试图弄清楚以下是否比替代方案更快(即访问数据库更少):
team = Team.objects.get()
Player.objects.filter(team_id=team.id)
替代方案:
team = Team.objects.get()
Player.objects.filter(team=team)
【问题讨论】:
-
这将导致 same 查询。除了 Django 花费几个周期检查您传递的内容和访问主键之外,它没有任何区别。
-
@WillemVanOnsem 那么归结为易读性,您会建议后者吗?
-
我会使用
team.player_set.all(),但这当然是一种“品味”。 -
这里真正的优化是不获取团队,而是根据团队参数过滤玩家:
Player.objects.filter(team__name="Da Players"),但如果您仍然需要团队作为对象,请参阅 Willem 的答案。 -
@Melvyn 很有趣,为什么过滤 team__name 会比 ID 查询快?
标签: mysql django django-models django-rest-framework mysql-python