2013-08-26 218 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: ---'