Django: Как осуществлять навигацию по многоуровневым обратным отношениям?

У меня есть несколько моделей, которые связаны иерархически:

  • У проектов есть один или более экспериментов
  • Эксперименты имеют один или более сканов
  • Сканы имеют одно или более решений по сканированию

Если у меня есть конкретное решение о сканировании и я хочу получить проект, связанный с этим решением, как я могу это сделать?

В документации Django говорится о обратных отношениях, но примеры, похоже, ограничены одним уровнем отношений.

Например, чтобы получить ScanDecision, связанный с Scan, я могу сделать что-то вроде:

sd = ScanDecision.objects.get(id=1)
sd.scan_set.all() # Returns all scan objects related to the specific ScanDecision

Но что если я хочу получить Project, который связан с ScanDecision косвенно через Scan и Experiment?

например, что-то вроде этого, но без всех шагов?

sd = ScanDecision.objects.get(id=1) # The desired ScanDecision object
s = sd.scan_set.all() # Gets the related Scan object
e = s.experiment_set.all() # Gets the Experiment related to the selected Scan object
p = e.project_set.all() # Gets the Project related to the selected Experiment object

В идеале я хотел бы получить что-то вроде:

sd = ScanDecision.objects.get(id=1)
p = sd.project_set.all()

Примечание: Каждый объект знает только о своем непосредственно предшествующем объекте, например, отношения ForeignKey устанавливаются только между дочерним и родительским объектами, а не между любыми другими уровнями. Таким образом, ScanDecision имеет FK к Scan, но не к Experiment или Project. Аналогично, Scan имеет FK к Experiment, но не к Project.

Исходя из вашего обновления, вы можете использовать прямые отношения sd.scan.experiment.project. Чтобы ответить на вопрос, хотя для доступа к обратным отношениям вы можете сделать decisions = project.experiments.scans.decisions.all()

Вернуться на верх