我正在尝试建立一个网站,用户可以添加正在学习的课程。我想知道如何添加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)
答案 0 :(得分:2)
对于关系数据库,定义ManyToManyField
的模型无关紧要。 Django将创建一个额外的表,其中包含两个ForeignKey
到由ManyToManyField
链接的两个模型。
添加的相关管理器等都是Django逻辑。在窗帘的后面,它将查询中间的桌子。
但是,您需要修复related_name=…
parameter [Django-doc]。 related_name
在 reverse 中指定关系的名称,因此在这种情况下,从Course
到Profile
。因此,它应该类似于'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()