Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Django:需要DB模式的帮助(很多,外键关系)_Mysql_Django - Fatal编程技术网

Mysql Django:需要DB模式的帮助(很多,外键关系)

Mysql Django:需要DB模式的帮助(很多,外键关系),mysql,django,Mysql,Django,我对Django和MySQL都是新手,所以如果这是一个简单的问题,我很抱歉 我在一个项目管理网站工作。假设我们有一个程序。每个计划都有一定数量的里程碑,而这些里程碑又有一定数量的任务,需要完成这些任务才能达到里程碑。里程碑在不同的项目中是相同的,但不能保证每个里程碑所需的任务在各个项目中保持不变 这里有一个(缩写)models.py: 课程计划(models.Model): # ... complete=models.BooleanField() 里程碑=models.ManyToManyFie

我对Django和MySQL都是新手,所以如果这是一个简单的问题,我很抱歉

我在一个项目管理网站工作。假设我们有一个
程序
。每个计划都有一定数量的
里程碑
,而这些里程碑又有一定数量的
任务
,需要完成这些任务才能达到里程碑。里程碑在不同的项目中是相同的,但不能保证每个里程碑所需的任务在各个项目中保持不变

这里有一个(缩写)
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上
解决方案可能是在里程碑数据库中创建两个“里程碑A”:两个不同的行共享名称“里程碑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链接到。我有一种感觉,这就是我一直在寻找的,但我会检查,以确保并给你一个勾号,如果是的。谢谢