打印相关对象python的相关对象

时间:2017-07-09 14:02:18

标签: python django

我正在创建一个指南应用程序,其中每个指南由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>]

谢谢! :)

3 个答案:

答案 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