使用 Django ORM,如何在不有效地对每条记录进行单独调用的情况下访问相关表中的数据(或者冗余地对数据进行非规范化以使其更易于访问)?
假设我有 3 个模型:
class Tournament(models.Model):
name = models.CharField(max_length=250)
active = models.BooleanField(null=True,default=1)
class Team(models.Model):
name = models.CharField(max_length=250)
coach_name = models.CharField(max_length=250)
active = models.BooleanField(null=True,default=1)
class Player(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.DO_NOTHING
)
number = models.PositiveIntegerField()
age = models.PositiveIntegerField()
active = models.BooleanField(null=True,default=1)
Run Code Online (Sandbox Code Playgroud)
请注意,此玩家模型在应用程序中很重要,因为它是与大多数模型的主要连接 - 从注册到团队到统计数据到结果到奖品。但此 Player 模型实际上并不包含人名,因为该模型包含一个用户字段,该字段是AUTH_USER_MODEL包含名字/姓氏信息的自定义(“用户”)模型的外键。这允许玩家登录到应用程序并执行某些操作。
除了这些基本模型之外,假设由于玩家可以在不同的锦标赛中为不同的球队效力,我还有一个连接的 ManyToMany 模型:
class PlayerToTeam(models.Model):
player = models.ForeignKey(
Player,
on_delete=models.DO_NOTHING
)
team = models.ForeignKey(
Team,
on_delete=models.DO_NOTHING
)
tournament = models.ForeignKey(
Tournament,
on_delete=models.DO_NOTHING
)
Run Code Online (Sandbox Code Playgroud)
作为我遇到的挑战之一的例子,假设我正在尝试创建一种允许教练选择首发阵容的表格。因此,我需要我的表格来列出特定锦标赛中特定团队的球员姓名。
给定锦标赛和团队 ID,我可以轻松提取必要的 QuerySet 来描述我感兴趣的初始记录。
playersOnTeam = PlayerToTeam.objects.filter(tournament=[Tournament_id]).filter(team=[Team_id]) …Run Code Online (Sandbox Code Playgroud)