2013-08-26 162 views
1

我试图建立一个电子学习平台如何查询多对多的关系?

我有用户(Utilisateur)谁可以采取几个课程,每门课程有几个模块和模块可以在几门课程

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

管理

我不熟悉的概念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) 

我的问题:

。如何通过模块来获取用户的分数和过程显示出来,这样的:

-Course A 

*Module 1 

    score : 5 

*module 2 : 

    score : 8 

... 

-Course B 

*Module 1: 

    score 7 

.... 

。我需要在课程和用户之间添加多对多的关系,因为我不知道哪个课程受哪个用户影响,因为他知道模块可以属于几个课程,在Utilisateur中添加course = models.ManyToManyField('Course')是否正确?

回答

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

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: ---'