Django 如何查询多对多关系?
我正在尝试建立一个电子学习平台 我有用户(利用者)他们可以学习多个课程,每个课程都有多个模块,一个模块可以在多个课程中 用户可以是学生、教师或管理员,学生由一名或多名教师“管理”,教师也可以由教师(如果他是研究人员)管理,教师由管理员管理 我不熟悉很多对很多的概念,请纠正我 这是我的django车型:Django 如何查询多对多关系?,django,django-models,many-to-many,Django,Django Models,Many To Many,我正在尝试建立一个电子学习平台 我有用户(利用者)他们可以学习多个课程,每个课程都有多个模块,一个模块可以在多个课程中 用户可以是学生、教师或管理员,学生由一名或多名教师“管理”,教师也可以由教师(如果他是研究人员)管理,教师由管理员管理 我不熟悉很多对很多的概念,请纠正我 这是我的django车型: class Utilisateur(models.Model): user = models.OneToOneField(User) role = mode
class Utilisateur(models.Model):
user = models.OneToOneField(User)
role = models.CharField(choices=ROLES,blank=False,max_length=50)
managed_by = models.ManyToManyField('self',
related_name='managers',
symmetrical=False,
blank=True)
course = models.ManyToManyField('Course') #can I do it? (question 2)
module = models.ManyToManyField('Module', through='UtilisateurModule')
class Course(models.Model):
titre = models.CharField(blank=False,max_length=100)
class Module(models.Model):
titre = models.CharField(blank=False,max_length=100)
course = models.ManyToManyField(Course, through='ModuleCourse')
class ModuleCourse (models.Model):
module = models.ForeignKey(Module)
course = models.ForeignKey(Course)
order = models.IntegerField(blank=False)
class UtilisateurModule (models.Model):
user = models.ForeignKey(Utilisateur)
module = models.ForeignKey(Module)
score = models.IntegerField(blank=False)
我的问题是:
1。如何按模块获取用户的分数并按课程显示,如下所示:
-Course A
*Module 1
score : 5
*module 2 :
score : 8
...
-Course B
*Module 1:
score 7
....
2。我需要在课程和用户之间添加一个多对多关系,因为我不会仅仅通过影响一个模块来告诉他哪个课程影响了哪个用户,因为他知道该模块可以属于多个课程,在Usilizateur?广告2中添加一个course=models.ManyToManyField('course')
是否正确。
是的,没错。但您必须记住,当用户开始学习某些课程时,其中一些课程具有相同的模块,您只能为这些模块存储一个标记。要防止这种情况,您需要创建如下类:
class UtilisateurCourseModule(models.Model):
user = models.ForeignKey(Utilisateur)
course = models.ForeignKey(Course)
module = models.ForeignKey(Module)
score = models.IntegerField()
公元1年
解决
1-我就是这样做到的:
course = Utilisateur.objects.get(user=current_user).course.all()
course_sets = []
for p in course:
modules = Module.objects.filter(course__id=p.pk).order_by('modulecourse__order')
modules_sets = []
for m in modules:
score = UtilisateurModule.objects.get(module=m,utilisateur=current_user)
modules_sets.append((m, score))
course_sets.append((p, modules_sets))
2-我将course=models.ManyToManyField('course')
添加到usilizateur
然后添加了一些手动验证,即每当课程对用户产生影响时,该课程中的模块也会对usilizateurmodule
course = Utilisateur.objects.get(user=current_user).course.all()
course_sets = []
for p in course:
modules = Module.objects.filter(course__id=p.pk).order_by('modulecourse__order')
modules_sets = []
for m in modules:
score = UtilisateurModule.objects.get(module=m,utilisateur=current_user)
modules_sets.append((m, score))
course_sets.append((p, modules_sets))