我正在建立一个显示指南的网站。 每个指南都有步骤。 每个步骤都有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
答案 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
设置为序列号;对于每个父模型,它必须是唯一的。您需要手动更新序列号或为其创建迁移。unique_together
约束不会被应用。名称必须引用模型中的属性。migrations
(您应该)管理数据库,则可能需要在多个步骤中执行此更改:
sequence_number
添加到模型中,设置null=True
属性。不要在unique_together
类中设置Meta
属性。sequence_number
(检查here如何创建自定义迁移。)parent_model, sequence_number
是否没有重复项unique_together
类中设置Meta
属性,删除序列号的null=True
属性sequence_number
<强>&LT;&LT;修改