gpt4 book ai didi

mysql - Django:需要有关 DB 模式的帮助(ManyToMany,ForeignKey 关系)

转载 作者:行者123 更新时间:2023-11-29 03:12:07 25 4
gpt4 key购买 nike

我是 Django 和 MySQL 的新手,所以如果这最终成为一个简单的问题,我深表歉意。

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

这是一个(缩写的)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 有一个里程碑 A,计划 2 也有一个里程碑 A。
  • 向计划 1 的里程碑 A 添加任务。
  • 不良后果:该任务现在也附加到计划 2 的里程碑 A。

解决方案可能是在里程碑数据库中创建两个“里程碑 A”:两个不同的行共享名称“里程碑 A”。然而,考虑到它们只是 id 不同,而它们是相同的概念项目,这似乎是一种浪费。

另一个想法可能是在添加新的 Task 时同时需要 ProgramIDMilestoneID,但我不确定可能会在 Django Admin 中添加新任务 - 即如何传递用户当前正在查看的程序的 ProgramID

我应该如何调整我的 models.py,以便程序可以共享里程碑,同时为每个里程碑分配一组任务(即避免上述情况)?

最佳答案

由于您希望任务与程序的里程碑相关而不是里程碑,您可以将类任务更改为:

class Task(models.Model):
# ...
complete = models.BooleanField()
programMilestone = models.ForeignKey(ProgramMilestone)

关于mysql - Django:需要有关 DB 模式的帮助(ManyToMany,ForeignKey 关系),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6526833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com