2017-07-09 122 views
0

我正在创建一个指南应用程序,其中每个指南由3个类组成,如下图所示。打印相关对象的对象python

我如何为第2步的例子打印子任务3在引导1

这是我可以在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

guide = Guide.objects.get(1); step = guide.step_set.filter(id = 2);打印(step.subtask_set.filter(id = 3)) – hadi

+0

谢谢!但我得到一个类型的错误,当我做: >>>指南= Guide.objects.get(PK = 1) 回溯(最近最后一次通话): 文件 “”,1号线,在 文件“ /Library/Python/2.7/site-packages/django/db/models/manager.py“,第122行,在manager_method中 return getattr(self.get_queryset(),name)(* args,** kwargs) File” /Library/Python/2.7/site-packages/django/db/models/query.py“,第387行,获取 self.model._meta.object_name DoesNotExist:指南匹配查询不存在。 – 9minday

+0

因为id = 1的指南不存在 – hadi

回答

0

如果你有guide1,然后,

subtasks = Subtask.objects.filter(step__guide=guide1) 

subtasks将有关guide1Subtask对象的查询集。 然后,您可以使用任何附加条件获取子任务。

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() 
+0

再次感谢! :D 我还没有想出来,但我做到了。当你输入Subtask.objects.all() 'taskoftheday/models.py“,line 35,in __str__ return''.join([self.subtask_title,'。'join( [self.step.guide.id,self.step.id,self.id])]) TypeError:序列项目0:期望的字符串,发现的int' – 9minday

+0

答案已更新;)TypeError:序列项目0:期望的字符串, int找到' – hadi

0

How do I for example print subtask 3 of step 2 in guide 1

有一个根本性的问题在这里,因为你没有在你的模型的任何地方,你定义的任务顺序的一个具体步骤。所以没有“第三项任务”,只有“任务#3”可能属于任何一个步骤。

因此,您需要先增强您的任务模型,以便订购,因此打印任务需要完成的顺序很容易。

这里是实现这个简化的模型集:

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() 

现在,当你获得这个任务,他们将按照正确的顺序。现在你可以做到这一点,这是“得到第三个任务,在第二个步骤,第一引导”:

Guide.objects.get(pk=1).get_step_order()[1].get_task_order()[2] 

文档进入约order_with_respect_to一些更多的细节。