【问题标题】:how to query a many to many relationship?如何查询多对多关系?
【发布时间】:2013-08-28 20:44:33
【问题描述】:

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

我有用户(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)

我的问题:

1。如何按模块获取用户的分数并按课程显示,就像这样:

-Course A

 *Module 1 

   score : 5

 *module 2 :

  score : 8

 ...

-Course B

 *Module 1:

   score 7

 ....

2。我需要在课程和用户之间添加多对多关系,因为我不会告诉哪个课程影响到哪个用户仅通过影响一个模块给他知道该模块可以属于几个课程,添加course = models.ManyToManyField('Course') 是否正确实用者?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      已解决

      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

      然后添加了一些手动验证,即每当 A 课程对用户产生影响时,该课程中的模块也会对 UtilisateurModule 中的同一用户产生影响

      【讨论】:

        猜你喜欢
        • 2016-12-15
        • 2017-02-02
        • 1970-01-01
        • 1970-01-01
        • 2017-03-16
        • 2011-02-18
        • 2023-04-01
        • 1970-01-01
        相关资源
        最近更新 更多