Django中两个模型之间的ManyToMany关系

时间:2020-05-02 21:53:07

标签: python django django-models django-forms

我正在尝试建立一个网站,用户可以添加正在学习的课程。我想知道如何添加ManyToMany关系。这样我们就可以根据课程代码或讲师或任何字段吸引所有用户参加课程。而且,我们还可以让用户注册课程。目前,我的数据库结构为:

class Course(models.Model):
    course_code = models.CharField(max_length=20)
    course_university = models.CharField(max_length=100)
    course_instructor = models.CharField(max_length=100)
    course_year = models.IntegerField(('year'), validators=[MinValueValidator(1984), max_value_current_year])

    def __str__(self):
        return self.course_code

和我的用户模型:

class Profile(AbstractUser):
    bio = models.TextField()
    image = models.ImageField(default='defaults/user/default_u_i.png', 
    courses = models.ManyToManyField('home.Course',related_name='courses')

    def __str__(self):
        return self.username

我想知道ManyToMany关系应该处于用户模型还是课程模型中?还是有什么不同?

编辑:为了现在添加课程以发布对象,我正在使用此视图,但它似乎不起作用:

@login_required
def course_add(request):

    if request.method == "POST":
        form = CourseForm(request.POST or none)
        if form.is_valid():
            course = form.save()
            request.user.add(course)
    else:
        form = CourseForm
    context = {
        'form':form
    }
    return render(request,'home/courses/course_add.html', context)

1 个答案:

答案 0 :(得分:2)

对于关系数据库,定义ManyToManyField的模型无关紧要。 Django将创建一个额外的表,其中包含两个ForeignKey到由ManyToManyField链接的两个模型。

添加的相关管理器等都是Django逻辑。在窗帘的后面,它将查询中间的桌子。

但是,您需要修复related_name=… parameter [Django-doc]related_name reverse 中指定关系的名称,因此在这种情况下,从CourseProfile。因此,它应该类似于'profiles'

class Profile(AbstractUser):
    bio = models.TextField()
    image = models.ImageField(default='defaults/user/default_u_i.png', 
    courses = models.ManyToManyField('home.Course', related_name='profiles')

    def __str__(self):
        return self.username

因此,您可以通过以下方式获得参与Course对象的人员:

mycourse.profiles.all()

,然后您可以访问其中注册了courses的{​​{1}}:

Profile

有关更多信息,请参见Many-to-many relationships section of the documentation

您可以使用以下方法将课程添加到用户的课程中:

myprofile.courses.all()