相关类的相关类django 1.9

时间:2017-07-26 12:53:11

标签: python django

我正在建立一个显示指南的网站。 每个指南都有步骤。 每个步骤都有sub_steps。

我已经像这个代码一样使用PK。

如何返回指南2中步骤5的sub_step 3?

此外,我尝试使用内联管理功能在指南中添加步骤,在步骤中添加sub_steps以使其保持井井有条,但只能使其与指南中的步骤一起使用。这是怎么做到的?

class Guide(models.Model):
    name = models.CharField(max_length=200)
    guide_category = models.CharField(max_length=70)
    guide_why = models.TextField()
    guide_how = models.TextField()

    def __unicode__(self):
        return self.name

class Step(models.Model):
    guide = models.ForeignKey(Guide, on_delete=models.CASCADE)
    sequence_number = models.PositiveIntegerField(default=1)
    step_title = models.CharField(max_length=10)

    class Meta:
        unique_together = ("guide", "sequence_number")

    def __unicode__(self):
        return self.step_title

class Task(models.Model):
    step = models.ForeignKey(Step, on_delete=models.CASCADE)
    sequence_number = models.PositiveIntegerField(default=1)
    task_title = models.CharField(max_length=10)
    task_img = models.ImageField()
    task_task = models.TextField()
    task_description = models.TextField()

    class Meta:
        unique_together = ("step", "sequence_number")

    def __unicode__(self):
        return self.task_title

1 个答案:

答案 0 :(得分:0)

关于你的第一个问题:如果你想通过序列号检索步骤和子步骤,你不能依赖每个模型的PK,因为PK不遵循与父表相关的序列。

试试这个:

class Step(models.Model):
    guide = models.ForeignKey(Guide, on_delete=models.CASCADE)
    sequence_number = models.PositiveIntegerField()
    step_title = models.IntegerField(default=1)

    class Meta:
        unique_together = ("guide", "sequence_number")


class Sub_step(models.Model):
    step = models.ForeignKey(Step, on_delete=models.CASCADE)
    sequence_number = models.PositiveIntegerField()
    sub_step_title = models.IntegerField(default=1)
    sub_step_img = models.ImageField()
    sub_step_task = models.TextField()
    sub_step_description = models.TextField()

    class Meta:
        unique_together = ("step", "sequence_number")

unique_together将在数据库中创建一个约束,以确保每个父对象都有唯一的sequence_number

当模型插入数据库时​​,您需要设置sequence_number

然后,您可以执行以下操作:

guide = Guide.objects.get(...)  # fetch by PK maybe
step_5 = Step.objects.get(guide=guide, sequence_number=5)
example = Sub_step.objects.get(step=step_5, sequence_number=3)

希望这有帮助。

编辑>>

您需要考虑以下几点:

  • 您无法将default=1设置为序列号;对于每个父模型,它必须是唯一的。您需要手动更新序列号或为其创建迁移。
  • 正如@Selecsosi指出的那样,unique_together约束不会被应用。名称必须引用模型中的属性。
  • 如果您通过migrations(您应该)管理数据库,则可能需要在多个步骤中执行此更改:
    1. sequence_number添加到模型中,设置null=True属性。不要在unique_together类中设置Meta属性。
    2. 制作并应用迁移
    3. 创建迁移以相应地更新每个模型的sequence_number(检查here如何创建自定义迁移。)
    4. 应用迁移,检查数据库中的parent_model, sequence_number是否没有重复项
    5. unique_together类中设置Meta属性,删除序列号的null=True属性
    6. 创建并应用迁移
    7. 每次插入新步骤和子步骤时都要处理sequence_number

<强>&LT;&LT;修改