Как извлечь записи из отношения многие ко многим - PullRequest
1 голос
/ 08 января 2020

У меня есть приложение, которое используется для управления заданиями помощника. Следовательно, модель состоит из 3 моделей: человек, курс, приложение (типичное отношение «многие ко многим»). Мой models.py выглядит следующим образом:

class Person(AbstractUser):
  ...

class Course(models.Model):
  year = models.charField(max_length=9)
  term = ...

class Applications(models.Model):
    applicant = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="applicant")
    course = models.ForeignKey(Course, on_delete=models.CASCADE)
    status = models.CharField(max_length=255, default='Pending')

В контексте формы мне нужно получить все курсы, которые были наняты человеком, чтобы заполнить раскрывающийся список.

Легко получить все приложения текущего пользователя, который имеет статус «Наем»:

Applications.objects.filter(applicant=user, status="Hired")

, но я не могу получить набор запросов для всех связанных курсов:

Applications.objects.filter(applicant=user, status="Hired").course_set

возвращает мне:

AttributeError: у объекта 'QuerySet' нет атрибута 'course_set'

Согласно Django документации , этот атрибут должен существовать.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Просто используйте _set для доступа к нему.

Попробуйте сначала с документами, чтобы понять идею. https://docs.djangoproject.com/en/3.0/ref/models/relations/

0 голосов
/ 08 января 2020

Обратный метод доступа course_set доступен для экземпляра модели Applications, а не для набора запросов (который возвращает Applications.objects.filter).

Например, если у вас есть Applications экземпляр с именем application, вы можете сделать:

application.course_set.all()

, чтобы получить все экземпляры Course, связанные с application.


Если вы хотите получить связанные Course экземпляры из отфильтрованного Applicaitons:

Applications.objects.filter(
    applicant=user, status="Hired"
).values_list(
    'course', flat=True
).distinct()

. Это вернет первичные ключи связанных Course экземпляров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...