我正在努力理解Django模型中的一对多和多对多关系是如何工作的。到目前为止,我的架构看起来像这样,我愿意接受更好的建议。
用户与团队之间的多对多关系。此外,还会有一个属于团队特定用户的计划。
这就是我的模型到目前为止的样子,
class Team(models.Model):
tid = models.AutoField(primary_key=True)
team_name = models.CharField(max_length=30)
manager_name = models.CharField(max_length=30)
class Schedule(models.Model):
sid = models.AutoField(primary_key=True)
user = models.OneToOneField(User)
date = models.DateField()
start_time = models.TimeField()
end_time = models.TimeField()
pay_rate = models.CharField(max_length=30)
location = models.CharField(max_length=50)
class BelongsTo(models.Model):
bid = models.AutoField(primary_key=True)
user = models.OneToOneField(User)
team = models.ForeignKey(Team, on_delete=models.CASCADE)
schedule = models.ForeignKey(Schedule, on_delete=models.CASCADE)
问题:我想了解每个用户的信息,他们的日程安排以及每个日程表所属的团队。我该怎么办?我试过了BelongsTo.objects.select_related().all()
,但这对我不起作用。
注意:我愿意接受建议,如果我的架构或模型或方法有问题,请告诉我。
答案 0 :(得分:1)
BelongsTo
似乎是实用工具表。所以
BelongsTo.objects.all().values('user', 'team__team_name', 'schedule')
答案 1 :(得分:0)
您的架构看起来几乎正确,但我会稍微修改一下。特别是,我将更改Schedule
的实施方式。我会将sid
表中的用户和团队作为外键包含在User Belongs To
连接表中,而不是Schedule
。
这就是Django模型的样子:
class User(models.Model):
username = models.CharField(max_length = 200)
# put other fields like password etc. here
class Team(models.Model):
team_name = models.CharField(max_length=30)
manager_name = models.CharField(max_length=30)
user = models.ManyToManyField("User")
class Schedule(models.Model):
user = models.ForeignKey("User")
team = models.ForeignKey("Team")
date = models.DateField()
start_time = models.TimeField()
end_time = models.TimeField()
pay_rate = models.CharField(max_length=30)
location = models.CharField(max_length=50)
请注意以下事项:
pk
或id
的主键字段。User Belongs To
模型。当您使用ManyToManyField时,Django会自动实现User Belongs To
之类的连接表。请参阅Django docs on many-to-many relationships。on_delete = models.CASCADE
,因为这是默认行为。 要了解如何从此模型配置中获取有关用户,团队和日程安排的信息,请参阅Django documentation on making db queries。这很容易。