拥有多个值的ForeignKey?正确的解决方案?

时间:2018-05-16 23:54:51

标签: python django

我决定开始在Django中创建自己的LMS,以便在我的高级Python课程中完成最终项目,不幸的是,我已经在进步方面达到了障碍。

我有两个模特。

  • 课程模型,由多个成员(ManyToMany字段)
  • 组成
  • 个人资料模型,由几个课程(ForeignKey字段)
  • 组成

我的问题是,如何将个人资料模型链接到多个课程?

到目前为止,这是我的代码:

class Course(models.Model):
    name = models.CharField(max_length=20)
    members = models.ManyToManyField(User, related_name=("Members"))
    def __str__(self):
        return str(self.name)

class Profile(models.Model):
    role = models.CharField(max_length=1, choices=roles)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    courses = models.ForeignKey(Course)

    USERNAME_FIELD = 'user'
    REQUIRED_FIELDS = ['user', 'password', 'role']
    def __str__(self):
        return str(self.user)

    @receiver(post_save, sender=User)
    def create_or_update_user_profile(sender, instance, created, **kwargs):
        if created:
            Profile.objects.create(user=instance)
        instance.profile.save

1 个答案:

答案 0 :(得分:0)

外键关系允许模型的多个实例与其他模型的单个实例相关联,即

class Profile(models.Model):
    ...
    courses = models.ForeignKey(Course)

只允许一个Course与给定的Profile相关联(但多个Profile可以与单个Course相关联。您可能会将其视为父母>子关系,其中Course是父项,Profile是子项。

如果您需要关联多个Course以与Profile关联(并且仍然可以与Profile关联多个Course,那么您应使用ManyToMany关系,例如:

class Profile(models.Model):
    ...
    courses = models.ManyToMany(Course)

这有效地创建了一个连接双方的第三个隐藏表(称为through表):

这是通过表格的示例。请注意,您不必手动创建此项,因为通常没有模型(它是隐式的),数据库表由Django自动生成:

class ProfileCourse(models.Model):
    profile = models.ForeignKey(Profile)
    course = models.ForeignKey(Profile)