获取Django模型中的所有相关字段

时间:2017-05-10 18:30:15

标签: django django-models

我正在努力理解Django模型中的一对多和多对多关系是如何工作的。到目前为止,我的架构看起来像这样,我愿意接受更好的建议。

enter image description here

用户与团队之间的多对多关系。此外,还会有一个属于团队特定用户的计划。

这就是我的模型到目前为止的样子,

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(),但这对我不起作用。

注意:我愿意接受建议,如果我的架构或模型或方法有问题,请告诉我。

2 个答案:

答案 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)

请注意以下事项:

  1. 您不需要在模型中拥有主键字段,因为Django会自动添加名为pkid的主键字段。
  2. 请注意缺少User Belongs To模型。当您使用ManyToManyField时,Django会自动实现User Belongs To之类的连接表。请参阅Django docs on many-to-many relationships
  3. 您在ForeignKey字段上也不需要on_delete = models.CASCADE,因为这是默认行为。
  4. 要了解如何从此模型配置中获取有关用户,团队和日程安排的信息,请参阅Django documentation on making db queries。这很容易。