2015-06-01 3 views
1

У меня есть две таблицы. Первая, это базовая пользовательская таблица. А вторая - таблица под названием «Секция».Django ManyToMany обратный запрос с определенным ключом

def User(models.Model): 
    ... 
    is_teacher = models.BooleanField(default=False) 
    ... 

def Section(models.Model): 
    ... 
    teachers = models.ManyToManyField(User, related_name="teachers") 
    students = models.ManyToManyField(User, related_name="students") 
    is_active = models.BooleanField(default=True) 
    ... 

Я хотел бы получить все студенческие пользователь (указанные в таблице пользователя с is_teacher=False), которые я знаю, можно легко сделать с User.objects.filter(is_teacher=False).

Я хотел бы также получить активный раздел (ы) для каждого пользователя.

Но на данный момент я даже не могу получить набор разделов для пользователей.

Я пробовал:

students = User.objects.filter(is_teacher=False) 
for s in students: 
    print s.section_set.all() 

Но я получаю сообщение об ошибке, что User объект не имеет section_set. Я предполагаю, потому что раздел имеет два много разных отношений с таблицей User (преподаватели и ученики), я, вероятно, должен более четко определить отношения (чтобы следить за учениками, а не учителями). Но я не уверен, как это сделать.

ответ

1

При определении related_name значение, иметь в виду, что это имя для назад отношение (в вашем случае - от User до Section). Таким образом, чтобы сохранить ваш код ясным и легко понять, я бы порекомендовал вам изменить имена, как это:

def Section(models.Model): 
    ... 
    teachers = models.ManyToManyField(User, related_name="sections_where_teacher") 
    students = models.ManyToManyField(User, related_name="sections_where_student") 
    is_active = models.BooleanField(default=True) 
    ... 

Тогда, используя соотношения выглядит следующим образом:

print s.sections_where_student.all() 
+1

Спасибо. Теперь, чтобы понять реальную цель поля related_names ... – akajb

0

попробовать это:

sec = Section.object.filter(students = students, is_active=True) 

вы получите раздел объекты для студентов, которые активно.

0

Вы определили related_name явно на ваших полях ManyToMany, так что это сбруя вы должны использовать:

print s.students.all() 

Не то, чтобы фактические вы использовали не имеет большого смысла имен; обратная связь не «ученики», это «разделы как ученики».

Смежные вопросы