Django中两个模型之间的多对多关系

ash*_*999 3 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
Run Code Online (Sandbox Code Playgroud)

和我的用户模型:

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
Run Code Online (Sandbox Code Playgroud)

我想知道多对多关系应该在用户模型还是课程模型中?或者它会有所作为吗?

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

@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)
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 6

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

添加的相关管理器等都是django逻辑。在窗帘后面,它会查询中间的表。

但是,您需要修复related_name=…参数 [Django-doc]。该related_name指定的关系的名称相反,从这样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
Run Code Online (Sandbox Code Playgroud)

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

mycourse.profiles.all()
Run Code Online (Sandbox Code Playgroud)

并且您可以使用以下方式访问coursesaProfile所注册的:

myprofile.courses.all()
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅文档的多对多关系部分

您可以通过以下方式将课程添加到用户的课程中:

@login_required
def course_add(request):
    if request.method == 'POST':
        form = CourseForm(request.POST)
        if form.is_valid():
            course = form.save()
            request.user.courses.add(course)
    else:
        form = CourseForm()
    context = {
        'form': form
    }
    return render(request,'home/courses/course_add.html', context)
Run Code Online (Sandbox Code Playgroud)