【问题标题】:Maintaining multiple instance of the same object in Django models在 Django 模型中维护同一对象的多个实例
【发布时间】:2019-05-22 17:30:52
【问题描述】:

我正在 Django 中创建一个小应用程序,我需要在其中维护不同课程的培训批次的详细信息。这些批次中的每一个都有一个要涵盖的主题列表。例如,python 课程可以由不同学院的不同培训师同时进行,因此他们都有自己的主题列表。以下是我想出的,但认为我错了。我对如何去做感到困惑。请提出正确的方法。

到目前为止我的模型,

class Course(models.Model):
    name = models.CharField(max_length=50, default="Enter Course Name")

class Trainer(models.Model):
    name = models.CharField(max_length=50, default="Enter Trainer Name")

class College(models.Model):
    name = models.CharField(max_length=50, default="Enter College Name")

class CourseBatch(models.Model):
    startDate = models.DateField(null = True, blank = True)
    endDate = models.DateField(null = True, blank = True)
    batchName = models.CharField(max_length=50, default="Enter Batch Name")
    course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name="course")
    trainer = models.ForeignKey(Trainer, on_delete=models.CASCADE, related_name="trainer")
    college = models.ForeignKey(College, on_delete=models.CASCADE, related_name="college")

class CheckPoints(models.Model):
    description = models.CharField(max_length=50, default="Enter Description")
    chkPoint = models.BooleanField(default=False)    
    course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name="course")

class ChkListForBatch(models.Model):
    batch = models.ForeignKey(CourseBatch, on_delete=models.CASCADE, related_name="coursebatch")
    chkpoint = models.ForeignKey(CheckPoints, on_delete=models.CASCADE, related_name="chkpoint")

这里每个 CourseBatch 都需要有自己的一组检查点(主题)来涵盖。我该如何实现呢?

【问题讨论】:

  • 为什么 CourseBatch 和 CheckPoints 之间没有 ForeignKey 关系?
  • 我对此感到困惑,因为我希望将多个检查点与单个课程批次相关联。它们也应该保存为不同的对象。如果我有外键关系,我可以关联单个检查点,但不能关联多个。这就是我创建 ChkListForBatch 的原因。让我知道你的想法。
  • 我添加了答案,我在带有 cmets 的 CheckPoints 模型中添加了两个字段。祝你好运。

标签: django django-models


【解决方案1】:

据我了解,您有每个源的检查点列表。并且您想要选择每个特定批次的检查点。

已更新。如果你想保存完成的控制点或不保存,请执行以下操作:

class Course(models.Model):
    name = models.CharField(max_length=50, default="Enter Course Name")

class Trainer(models.Model):
    name = models.CharField(max_length=50, default="Enter Trainer Name")

class College(models.Model):
    name = models.CharField(max_length=50, default="Enter College Name")

class CourseBatch(models.Model):
    startDate = models.DateField(null = True, blank = True)
    endDate = models.DateField(null = True, blank = True)
    batchName = models.CharField(max_length=50, default="Enter Batch Name")
    course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name="course")
    trainer = models.ForeignKey(Trainer, on_delete=models.CASCADE, related_name="trainer")
    college = models.ForeignKey(College, on_delete=models.CASCADE, related_name="college")

class CheckPoints(models.Model):
    description = models.CharField(max_length=50, default="Enter Description")
    course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name="course")

class ChkListForBatch(models.Model):
    batch = models.ForeignKey(CourseBatch, on_delete=models.CASCADE, related_name="coursebatch")
    checkpoint = models.ForeignKey(CheckPoints, on_delete=models.CASCADE, related_name="chkpoint")
    checkpoint_is_done = models.BooleanField(default=False)    

【讨论】:

  • 这对我来说看起来不错,会尝试一下,然后接受它作为答案。另外请让我知道当数据来自不同模型并保存到不同模型中时,我将如何在表单上填充这些字段,因为我是 Django 新手
  • 先看这个,例如:stackoverflow.com/questions/25674855/…。并且注意模型的字段名需要用小写字母docs.djangoproject.com/en/dev/internals/contributing/…
  • 您好 Vyacheslav,感谢您的建议,但是该链接显示了如何在同一网页上显示相同的表单两次。我的问题是我没有表单模型,因为我将在运行时查询给定批次的数据(ChkListForBatch 项)。因此,在创建批次时,我必须根据课程查询检查点,然后将它们保存到 ChkListForBatch 中,然后在选择相应的 CourseBatch 时将它们显示在表单上
  • 你的问题太宽泛了,我不太明白它是什么。我认为您应该开始,然后通过演示代码提出问题。
  • 您好,根据原始问题,请建议我如何在从管理界面创建新的 CourseBatch(基于所选课程 ID 及其检查点)时自动填充 chkListForbatch。我不希望用户手动填充相应的 chkListForbatch 项,因为那是重复的机械工作。
【解决方案2】:
class Course(models.Model):
    name = models.CharField(max_length=50, default="Enter Course Name")

class Trainer(models.Model):
    name = models.CharField(max_length=50, default="Enter Trainer Name")

class College(models.Model):
    name = models.CharField(max_length=50, default="Enter College Name")

class CourseBatch(models.Model):
    startDate = models.DateField(null = True, blank = True)
    endDate = models.DateField(null = True, blank = True)
    batchName = models.CharField(max_length=50, default="Enter Batch Name")
    course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name="course")
    trainer = models.ForeignKey(Trainer, on_delete=models.CASCADE, related_name="trainer")
    college = models.ForeignKey(College, on_delete=models.CASCADE, related_name="college")

class CheckPoints(models.Model):
    description = models.CharField(max_length=50, default="Enter Description")
    chkPoint = models.BooleanField(default=False)    
    course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name="course")
    course_batch = models.ForeignKey(to=CourseBatch, on_delete=models.CASCADE) # This means that you have multiple checkpoints associated with single coursebatch.
    course_batch_m2m = models.ManyToManyField(to=CourseBatch) # This will create intermediate model, with columns checkpoints_id | coursebatch_id. This means multiple checkpoints has multiple coursebatch and vice-versa.

class ChkListForBatch(models.Model):
    batch = models.ForeignKey(CourseBatch, on_delete=models.CASCADE, related_name="coursebatch")
    chkpoint = models.ForeignKey(CheckPoints, on_delete=models.CASCADE, related_name="chkpoint")

检查 CheckPoints 模型,我添加了 ForeignKeyManyToManyField 与解释。

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    相关资源
    最近更新 更多