2013-03-01 70 views
0

我试图教自己Django并为老师列表应用程序构建了一个简单的模型。有课程级别(小学,中学,高中等),课程,教师和教师课程成员。用ForeignKey和ManyToMany查询Django模型

我想获取课程级别&其教师订阅特定成员资格的课程。目前我正在做以下(显然是一个非常不好的做法,但由于DB很小它的正常工作):

course_levels = CourseLevel.objects.prefetch_related('course_set') 

    # get mainpage teachers 
    # TODO: This is inefficient, there must be some cool way of doing the same. 
    for course_level in course_levels: 
     for course in course_level.course_set. 
      course.visible_teachers = course.teachers.filter(membership__type=Membership.TYPE_FRONT_PAGE) 

这里是models.py

class Teacher(models.Model): 
    name = models.CharField(max_length=64) 

class CourseLevel(models.Model): 
    name = models.CharField(max_length=64) 

class Course(models.Model): 
    name = models.CharField(max_length=64) 

    # courses can have levels 
    level = models.ForeignKey(CourseLevel) 
    teachers = models.ManyToManyField(Teacher, through='Membership') 

class Membership(models.Model): 
    (TYPE_FRONT_PAGE, TYPE_COURSE_PAGE, TYPE_BASIC) = (1,2,3) 

    teacher = models.ForeignKey(Teacher, related_name='membership') 
    course = models.ForeignKey(Course) 

    MEMBERSHIP_TYPES = (
     (TYPE_FRONT_PAGE, _('Front Page')),   # Display users on the front page 
     (TYPE_COURSE_PAGE, _('Course Page')),  # Display users on the front of course page 
     (TYPE_BASIC, _('Basic Membership')),  # Display users after 
    ) 
    type = models.IntegerField(max_length=2, choices=MEMBERSHIP_TYPES) 

有什么更好的方式来获取这些记录,而不是迭代课程并在Django Query API中获取相关的教师?

在此先感谢。

+0

所以,你要一个属性添加到您的'Course'情况下,其列出按老师会员类型键入“课程”的教师? – Cole 2013-03-01 16:03:23

回答

0

我不确定这是否完全回答你想要的,但是,这是你想要做的搜索类型吗?

Membership.objects.filter(type = 1, course__level__name = 'college') 

我做了两个老师,无论谁是1型,都教导谁教于“大学”和另一谁教的“品位”“好玩”“好玩”类“乐趣”,和一个。这里有几个搜索的这些输出:

>>> members = Membership.objects.filter(type=1) 
>>> members 
[<Membership: Membership object>, <Membership: Membership object>] 
>>> members.filter(course__level__name='college') 
[<Membership: Membership object>] 
>>> Membership.objects.filter(type=1, course__level__name='college') 
[<Membership: Membership object>] 

也许这个搜索是最像一个你要求:

>>> Membership.objects.filter(course__name='fun', type=1) 
[<Membership: Membership object>, <Membership: Membership object>]