Mysql Django:需要DB模式的帮助(很多,外键关系)
我对Django和MySQL都是新手,所以如果这是一个简单的问题,我很抱歉 我在一个项目管理网站工作。假设我们有一个Mysql Django:需要DB模式的帮助(很多,外键关系),mysql,django,Mysql,Django,我对Django和MySQL都是新手,所以如果这是一个简单的问题,我很抱歉 我在一个项目管理网站工作。假设我们有一个程序。每个计划都有一定数量的里程碑,而这些里程碑又有一定数量的任务,需要完成这些任务才能达到里程碑。里程碑在不同的项目中是相同的,但不能保证每个里程碑所需的任务在各个项目中保持不变 这里有一个(缩写)models.py: 课程计划(models.Model): # ... complete=models.BooleanField() 里程碑=models.ManyToManyFie
程序
。每个计划都有一定数量的里程碑
,而这些里程碑又有一定数量的任务
,需要完成这些任务才能达到里程碑。里程碑在不同的项目中是相同的,但不能保证每个里程碑所需的任务在各个项目中保持不变
这里有一个(缩写)models.py
:
课程计划(models.Model):
# ...
complete=models.BooleanField()
里程碑=models.ManyToManyField(里程碑,通过class='ProgramMilestone')
类里程碑(models.Model):
# ...
课堂任务(models.Model):
# ...
complete=models.BooleanField()
里程碑=模型。外键(里程碑)
类程序里程碑(models.Model):
# ...
complete=models.BooleanField()
程序=型号。外键(程序)
里程碑=模型。外键(里程碑)
我有…通过class='ProgramMilestone'
,因为程序
应该被允许共享里程碑
,但每个程序都有一个完成状态
此架构的问题如下所示:
- 我们有两个程序,程序1和程序2
- 项目1有一个里程碑a,项目2也有一个里程碑a
- 将任务添加到程序1的里程碑a
- 不想要的结果:任务现在也附加到程序2的里程碑A上
id
上不同,而它们是相同的概念项目,这似乎是一种浪费
另一个想法可能是在添加新的任务时需要ProgramID
和MilestoneID
,但我不确定是否可以在Django管理员中添加新任务-也就是说,如何传递用户当前正在查看的程序的ProgramID
我如何调整我的models.py
,以便程序可以共享里程碑,同时每个里程碑都有一组每个程序的任务(即避免上述情况)?由于您希望任务与程序的里程碑相关,而不是与里程碑相关,您可以将类任务更改为:
class Task(models.Model):
# ...
complete = models.BooleanField()
programMilestone = models.ForeignKey(ProgramMilestone)
从我(外部)的角度来看,命名法并不是您想要定义数据库模式的真正依据。项目1下的里程碑A看起来像是,尽管它的名称相同,但可以有一组与项目2下的“相同”里程碑A完全不同的任务
我建议您做的是区分键名和显示名。例如,在里程碑模型上,您可以有两个名称:MilestoneKey(内部使用并存储为类似于“Program 1 MistoneA”的名称)和MilestoneName(类似于“MistoneA”)
在您的应用程序中,用户只能看到MilestoneName,而在内部,您可以将其作为MilestoneKey进行跟踪
或者,为了避免这种复杂性,只需使用MilestoneName字段并调用程序2的里程碑A成为里程碑X,或程序2-里程碑A。哦,天哪,我甚至不知道可以通过表将ForeignKey链接到。我有一种感觉,这就是我一直在寻找的,但我会检查,以确保并给你一个勾号,如果是的。谢谢