2013-03-01 2 views
0

Я пытаюсь научить себя Django и создать простую модель для приложения для включения в список учителей. Существуют курсы (начальная, средняя, ​​средняя школа и т. Д.), Курсы, преподаватели и членство в учебных заведениях.Запрос модели Django с ForeignKey и ManyToMany

Я хочу получить курсы курса & курсы, преподаватели которых подписаны на конкретное членство. В настоящее время я делаю следующее (очевидно, очень плохая практика, но 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

ответ

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>] 
Смежные вопросы