我正在创建一个指南应用程序,其中每个指南由3个类组成,如下所示。
我如何在指南1中打印第2步的子任务3
到目前为止,这是我在shell中可以做的事情。
class Guide(models.Model):
user = models.ForeignKey(User, default=1)
guide_category = models.CharField(max_length=250)
guide_title = models.CharField(max_length=500)
guide_how = models.CharField(max_length=100)
guide_why = models.CharField(max_length=100)
guide_logo = models.FileField()
is_complete = models.BooleanField(default=False)
def __str__(self):
return self.guide_title + ' - ' + self.guide_category + ' - ' + self.guide_how + ' - ' + self.guide_why
class Step(models.Model):
guide = models.ForeignKey(Guide, on_delete=models.CASCADE)
step_title = models.CharField(max_length=250)
is_complete = models.BooleanField(default=False)
def __str__(self):
return self.step_title
class Subtask(models.Model):
step = models.ForeignKey(Step, on_delete=models.CASCADE)
subtask_title = models.CharField(max_length=250)
subtask_description = models.CharField(max_length=250)
subtask_image = models.FileField()
is_complete = models.BooleanField(default=False)
def __str__(self):
return self.subtask_title
到目前为止,这是我在shell中可以做的事情。
from appname.models import Guide, Step, Subtask
guide1 = Guide(pk=1)
guide2 = Guide(pk=2)
>>> Guide.objects.all()
[<Guide: Test1 - CR - how1 - why2>, <Guide: test2 - VR - how2 - why2>]
>>> Step.objects.all()
[<Step: 1>, <Step: 2>, <Step: 1>, <Step: 2>]
>>> Subtask.objects.all()
[<Subtask: 1.1.1>, <Subtask: 1.1.2>, <Subtask: 1.2.1>, <Subtask: 1.2.2>, <Subtask: 2.1.1>]
谢谢! :)
答案 0 :(得分:0)
如果你有guide1
,那么,
subtasks = Subtask.objects.filter(step__guide=guide1)
subtasks
将是与Subtask
相关的guide1
个对象的查询集。
然后,您可以使用任何其他条件获取子任务。
答案 1 :(得分:0)
class Subtask(models.Model):
step = models.ForeignKey(Step, on_delete=models.CASCADE)
subtask_title = models.CharField(max_length=250)
subtask_description = models.CharField(max_length=250)
subtask_image = models.FileField()
is_complete = models.BooleanField(default=False)
def __str__(self):
return ' '.join([self.subtask_title, '.'.join([str(self.step.guide.id), str(self.step.id), str(self.id)])])
并测试它:
Subtask.objects.all()
答案 2 :(得分:0)
我如何在指南1中打印第2步的子任务3
这里有一个根本问题,因为您在模型中没有任何地方可以定义特定步骤的任务顺序。所以没有&#34;第三个任务&#34;,只有&#34;任务#3&#34;这可能属于任何步骤。
因此,您需要首先增强您的任务模型,以便有订单,这样就可以轻松打印需要完成任务的订单。
这是一个实现此目的的简化模型集:
class Step(models.Model):
name = models.CharField(max_length=200)
guide = models.ForeignKey('Guide', on_delete=models.CASCADE)
class Meta:
order_with_respect_to = 'guide'
class Task(models.Model):
name = models.CharField(max_length=200)
step = models.ForeignKey('Step', on_delete=models.CASCADE)
class Meta:
order_with_respect_to = 'step'
class Guide(models.Model):
name = models.CharField(max_length=200)
你可以像这样使用它:
g = Guide.objects.create('Guide 1')
step = Step.objects.create('Step 1')
task = Task.objects.create('Task 1')
last_task = Task.objects.create('Last Task')
task3 = Task.objects.create('Third Task')
task2 = Task.objects.create('Second Task')
# Add them first
step.task_set.add(task)
step.task_set.add(last_task)
step.task_set.add(task3)
step.task_set.add(task2)
# Get the default ordering, which is by primary key:
step.get_task_order()
# Arrange the tasks in the right order by the primary key:
step.set_task_order([task1.pk, task2.pk, task3.pk, last_task.pk])
# Finally, add it to the guide
g.step_set.add(step)
g.save()
现在,当您检索任务时,它们将按正确的顺序排列。现在你可以做到这一点,这是第三个任务,在第二步中,第一个指南&#34;:
Guide.objects.get(pk=1).get_step_order()[1].get_task_order()[2]
文档详细介绍了order_with_respect_to
。