0

私は自分自身に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でコースを繰り返して関連する教師を取得する代わりに、これらのレコードを取得するためのより良い方法は何ですか?

前もって感謝します。

4

1 に答える 1

0

これがあなたが望むものに正確に答えているかどうかはわかりませんが、これはあなたがやりたい検索のタイプ​​ですか?

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

どちらもタイプ 1 の 2 人の教師を作成し、どちらもクラスで「楽しい」を教え、1 人は「大学」で「楽しい」を教え、もう 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>]
于 2013-03-01T16:28:29.807 に答える