如何查询多对多的关系?

时间:2013-08-26 11:14:38

标签: django django-models many-to-many

我正在尝试构建电子学习平台

我有用户(Utilisateur)谁可以参加多个课程,每个课程都有几个模块,一个模块可以在几个课程中< / p>

用户可以是学生或教师或管理员,学生由教师或几个人“管理”,教师也可以由教师管理(如果他是研究员),教师由管理员管理

我不熟悉many_to_many概念,请纠正我

这是我的django模特:

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 即可。我需要在课程和用户之间添加多对多的关系,因为我不知道哪个课程影响到哪个用户只是通过影响模块给他知道模块可以属于几个课程,添加{{1}是否正确在Utilisateur?

2 个答案:

答案 0 :(得分:0)

广告2。 是的,这是对的。但是你必须记住,当用户启动某些课程时,其中一些课程具有相同的模块,你只能为这些模块存储一个标记。为了防止这种情况,你需要创建这样的类:

class UtilisateurCourseModule(models.Model):
    user   = models.ForeignKey(Utilisateur)
    course = models.ForeignKey(Course)
    module = models.ForeignKey(Module)
    score = models.IntegerField()

广告1。

for c in user.course.all(): # why course not courses?
    print "Course {}".format(c.titre)
    for m in c.module_set.all().order_by('modulecourse__order')
        print "Module {}".format(m.titre)
        try:
            print 'score: ', UtilisateurModule.objects.get(user=user,module=m).score
        catch UtilisateurModule.DoesNotExits:
            print 'score: ---'

答案 1 :(得分:0)

解决

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')添加到Utilisateur

然后添加了一些手动验证,每当课程受到影响时,该课程中的模块也会受到UtilisateurModule

中相同用户的影响