В Django, как я могу выполнить следующий запрос многие ко многим (используя сквозную таблицу)? - PullRequest
2 голосов
/ 19 января 2012

В моей модели у меня есть таблица для пользователей (которые являются студентами или преподавателями - у меня есть таблица UserProfile, которая связана с auth.User), таблица для курсов и таблица с названием enrollment, в которой записывается, какие студенты были зачисленына каких курсах.Мой models.py выглядит следующим образом:

class Course(models.Model):
    name       = models.CharField(max_length=40)
    instructor = models.ForeignKey(UserProfile, related_name="Instructor")
    students   = models.ManyToManyField(UserProfile, through='Enrollment')

class UserProfile(models.Model):
    user       = models.OneToOneField(User, primary_key=True)
    role       = models.CharField(max_length=4, choices=ROLE_CHOICES) # 'stud' or 'inst'

class Enrollment(models.Model):
    course   = models.ForeignKey(Course)
    student  = models.ForeignKey(UserProfile)

Для данного пользователя я хотел бы найти все курсы, в которые он / она зачислен. Как я могу это сделать?

ТакжеГде найти подробное объяснение того, как выполнять запросы в Django, желательно с большим количеством примеров, которые постепенно увеличиваются в сложности?

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Если у вас есть UserProfile экземпляр user_profile, попробуйте:

courses = Course.objects.filter(students=user_profile)

, если у вас есть User экземпляр user, тогда вы можете использовать двойное подчеркивание.

courses = Course.objects.filter(students__user=user)

Для объяснения я бы начал с документации django для Выполнение запросов .У других людей могут быть другие предложения.

В качестве отступления: в этом случае, если вы не используете устаревшую базу данных, вам не нужно явно определять присоединяющуюся таблицу Enrollment, поскольку у вас нетопределены дополнительные поля.

2 голосов
/ 19 января 2012

Если вместо экземпляра User у вас есть поле username из экземпляра User, вы можете сделать следующее:

courses = Course.objects.filter(students__user__username='thespecificusername')

Сценарий, который вы создаете, очень похож наобсуждаемый здесь: https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

...