2017-10-21 4 views
1

Ich versuche passieren müssen, um ein Modell für das folgende Szenario zu erstellen:Django Modelle - erstellen Elemente, die verschiedene Aufgaben

Ein Element geliefert wird und durch verschiedene Aufgaben in einer bestimmten Reihenfolge zu übergeben. Sobald das Element eine Aufgabe durchlaufen hat, wird die Aufgabe als abgeschlossen markiert. Die Namen der Aufgaben sind im Voraus bekannt.

Zum Beispiel:

  • erstellen Artikel
  • Aufgabe 1 'registrieren, den Punkt'
  • Aufgabe 2 'installieren Sie den Punkt'
  • Aufgabe 3 'überprüfen Protokolle Artikel'

Ich begann mit einem einfachen Modell wie diesem, b Aber es sieht sehr statisch für mich aus und nicht wirklich, was ich suche.

models.py

class Item(models.Model): 

    item_id = models.PositiveIntegerField() 
    item_priority = models.PositiveSmallIntegerField(default=2) 
    item_date_created = models.DateField(auto_now_add=True) 

    task1_name = models.CharField(max_length=128) 
    task1_done_by = models.CharField(max_length=64, blank=True) 
    task1_done_date = models.DateField(null=True, blank=True) 

    task2_name = models.CharField(max_length=128) 
    task2_done_by = models.CharField(max_length=64, blank=True) 
    task2_done_date = models.DateField(null=True, blank=True) 

    # ... next 20 tasks 

    def __str__(self): 
     return str(self.item_id) 

Versuch Relational Felder, zum Beispiel ein ManyToMany Feld vorab die Aufgaben, endete ich mit auf den Punkt:

class Task(models.Model): 

    name = models.CharField(max_length=128) 
    done_by = models.CharField(max_length=64, blank=True) 
    done_date = models.DateField(null=True, blank=True) 


class Item(models.Model): 

    item_id = models.PositiveIntegerField() 
    item_priority = models.PositiveSmallIntegerField(default=2) 
    item_date_created = models.DateField(auto_now_add=True) 
    tasks = models.ManyToManyField(Task) 

Aber, wenn ich zwei Elemente erstellen mit die gleichen Aufgaben und markieren Sie die Aufgabe des ersten Artikels als erledigt es wird auch im zweiten Artikel als erledigt markiert - das ist nicht das, was ich will.

Wie wird eine Aufgabe einem bestimmten Objekt zugewiesen? Oder welches andere Modell passt am besten zu meinem Szenario?

Antwort

1

Zum Ausführen von Code zum Zeitpunkt der Objekterstellung überschreiben Sie im Allgemeinen die Methode save(). Also, wenn ein Element erstellt wird, in der Methode save() Sie erstellen und Link dynamisch die Aufgaben

class Item(models.Model): 
    item_id = models.PositiveIntegerField() 
    item_priority = models.PositiveSmallIntegerField(default=2) 
    item_date_created = models.DateField(auto_now_add=True) 

    # remove m2m !!! 

    def save(self, *args, **kwargs): 
     # If it has no pk then it is a *new* item 
     if not self.pk: 

      # Save by manually 
      # Call save of parent class (models.Model) creating the custom class 
      super(Item, self).save(*args, **kwargs) 

      # Now you have the PK 
      t1 = Task(name='T1', item=self) 
      t1.save() 
      #... 

class Task(models.Model): 
    name = models.CharField(max_length=128) 
    done_by = models.CharField(max_length=64, blank=True) 
    done_date = models.DateField(null=True, blank=True) 

    # Add Item FK 
    item = models.ForeignKey(Item) 

Hinweis auf Code-Aktualisierung Item.tasks:

1) änderte ich die Richtung: die Aufgabe Links zum Gegenstand, nicht umgekehrt. Siehe https://docs.djangoproject.com/en/1.11/topics/db/examples/many_to_one/

2) Ich überprüfe immer noch, ob es eine neue Instanz ist, dann rufe SuperSave auf und dann erstelle ich die Aufgabe für dieses Element.

Stellen Sie sicher, dass der Wert self.pk überprüft wird. Andernfalls wird der Code auch beim Aktualisieren des Objekts ausgeführt.

Beachten Sie auch, dass Sie jedes Mal ein neues Task-Objekt erstellen müssen, das mit einem Item-Objekt verknüpft ist. Wenn Sie ein Aufgabenobjekt mit zwei Elementen verknüpfen, wird die Aufgabe, wenn item_a eine Aufgabe abschließt, auch für item_b abgeschlossen.

Was Sie tun müssen, ist Aufgabe 1 für item_a und task2 für item_b erstellen. Auf diese Weise trennen Sie die Aufgaben.

mehr lesen:

https://docs.djangoproject.com/en/1.11/ref/models/instances/#saving-objects

https://docs.djangoproject.com/en/1.11/topics/db/models/#relationships

+0

Ich habe meine Frage ein wenig angepasst, mein Problem zu klären: Wenn ich zwei Elemente mit den gleichen Aufgaben erstellen und die Aufgabe des ersten Elements markieren wie getan, wird es auch im zweiten Punkt als erledigt markiert - das ist nicht, was ich will und ich suche nach einer Lösung dafür. –

+1

Die Klasse Item (models.Models) ist eine Vorlage für ein Datenbankobjekt. Sie erstellen Instanzen daraus. Wenn Sie eine Aufgabeninstanz mit zwei Exemplarinstanzen verknüpfen und die Aufgabe aktualisieren, ist dies für die zwei Elemente, die dort verlinken, identisch. Was Sie tun müssen, ist Aufgabe1 für Element1 und Aufgabe2 für Element2 zu erstellen. Auf diese Weise trennen Sie die Aufgaben. – rollinger

+0

Ich beginne zu verstehen. Ich muss neue Aufgaben erstellen und mit jedem neuen Element verknüpfen und sie nicht wiederverwenden. Haben Sie zufällig ein Codebeispiel für das Erstellen und Hinzufügen einer Aufgabe von Hand? –

Verwandte Themen