Я новичок в Django и MySQL, поэтому извиняюсь, если это заканчивается простым вопросом.Django: нужна помощь с схемой DB (ManyToMany, отношения ForeignKey)
Я работаю над сайтом по управлению проектами. Скажем, у нас есть Program
. Каждая программа имеет некоторое количество Milestones
, которые, в свою очередь, имеют некоторое количество Tasks
, которые должны быть заполнены для достижения Milestone. Вехи будут одинаковыми в разных программах, но нет гарантии, что задачи, требуемые для каждой вехи, останутся неизменными во всех программах.
Вот (сокращенно) models.py
:
class Program(models.Model):
# ...
complete = models.BooleanField()
milestones = models.ManyToManyField(Milestone, through='ProgramMilestone')
class Milestone(models.Model):
# ...
class Task(models.Model):
# ...
complete = models.BooleanField()
milestone = models.ForeignKey(Milestone)
class ProgramMilestone(models.Model):
# ...
complete = models.BooleanField()
program = models.ForeignKey(Program)
milestone = models.ForeignKey(Milestone)
У меня есть ...through='ProgramMilestone'
потому Programs
должно быть разрешено обмениваться Milestones
, но имеют статус завершения каждой-программы.
Проблема с этой схемой является чем-то вроде этого:
- У нас есть две программы, программы 1 и 2. Программа
- Программа 1 имеет Milestone А, и Программа 2 также имеет Milestone А.
- Добавление задачи в Программе 1 по Milestone А.
- нежелательные последствия: задача теперь также прилагается к программе 2 в Milestone А.
Решение может состоять в том, чтобы создать две «Milestone A» в базе данных Milestone: две разные строки, которые разделяют имя «Milestone A.», Однако, учитывая, что они будут отличаться только в id
, будучи тем же концептуальным предметом, это кажется пустой тратой.
Другая идея может быть требовать одновременно ProgramID
и MilestoneID
при добавлении нового Task
, но я не уверен, что можно было бы добавить новые задачи в Django администратора - то есть, как пройти ProgramID
Программы что пользователь в настоящее время смотрит.
Как я могу адаптировать мой models.py
, чтобы программы могли делиться вехами, имея набор задач для каждой задачи для каждого этапа (т. Е. Избегая описанного выше сценария)?
О Боже, я даже не знаю, что вы могли бы связать ForeignKey с сквозные таблицы. У меня такое чувство, что это то, что я искал, но я проверю, чтобы убедиться и дать вам тик, если это так. Благодаря! –