2017-07-09 7 views
0

Ich erstelle eine Guide-App, in der jedes Handbuch aus 3 Klassen besteht.Drucken verwandtes Objekt verwandtes Objekt Python

Wie kann ich zum Beispiel Druck Unteraufgabe 3 von Schritt 2 in Führung 1

Das ist, was ich bisher in der Schale zu tun.

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 

Dies ist, was ich in der Shell so weit tun kann.

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>] 

Vielen Dank! :)

+0

guide = Guide.objects.get (1); step = guide.step_set.filter (id = 2); Drucken (step.sub_set.filter (id = 3)) – hadi

+0

Vielen Dank! Aber ich habe eine Art Störung, wenn ich tun: >>> Guide = Guide.objects.get (pk = 1) Traceback (jüngste Aufforderung zuletzt): File "" Linie 1 in File " /Library/Python/2.7/site-packages/django/db/models/manager.py ", Zeile 122, in manager_method Rückgabe getattr (self.get_queryset(), Name) (* args, ** kwargs) Datei" /Library/Python/2.7/site-packages/django/db/models/query.py ", Zeile 387, in get self.model._meta.Objektname DoesNotExist: Führende Suchabfrage existiert nicht. – 9minday

+0

weil Guide mit ID == 1 existiert nicht – hadi

Antwort

0

Wenn Sie guide1 dann

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

subtasks ein queryset von Subtask Objekte guide1 Zusammenhang wäre. Sie könnten dann die Teilaufgabe mit zusätzlichen Bedingungen erhalten.

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

und testen:

Subtask.objects.all() 
+0

Danke nochmal! : D Ich habe es immer noch nicht herausgefunden, aber ich habe das gemacht.Join change change zeigte mir und bekam dies bei der Eingabe von Subtask.objects.all() 'taskoftheday/models.py ", Zeile 35, in __str__ return' '.join ([self.task_title,'. '. join ([self.step.guide.id, self.step.id, self.id])]) TypeError: Sequenzelement 0: erwartete Zeichenfolge, int gefunden ' – 9minday

+0

Antwort aktualisiert;) für TypeError: Sequenzelement 0: erwartete Zeichenfolge, int gefunden ' – hadi

0

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

Es gibt ein grundlegendes Problem hier ist, weil Sie in Ihren Modellen nicht überall, wo Sie die Reihenfolge der Aufgaben für einen bestimmten Schritt definieren. Es gibt also keine "dritte Aufgabe", sondern nur die "Aufgabe # 3", die zu einem der Schritte gehören kann.

Sie müssen also zunächst Ihr Aufgabenmodell so erweitern, dass eine Bestellung vorliegt. So lässt sich die Reihenfolge, in der Aufgaben erledigt werden müssen, einfach drucken. Hier

ist ein vereinfachtes Modell-Set, das implementiert diese:

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) 

Sie es wie folgt verwenden können:

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

Wenn Sie jetzt die Aufgaben abrufen, sie in der richtigen Reihenfolge sein wird . Jetzt können Sie das tun, was „die dritte Aufgabe erhalten, in der zweiten Stufe der ersten Führung“:

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

Die Dokumentation geht in einige weitere Details über order_with_respect_to.

Verwandte Themen