wake-up-neo.net

Django - Funktion innerhalb eines Modells. Wie nennt man es aus einer Sicht?

Ich entwerfe ein Modell in Django, aber ich weiß nicht, ob dies der beste Weg ist. Ich habe ein Modell mit dem Namen "History" und in diesem Modell habe ich eine spezielle Funktion, die die Einfügungen für dieses Modell handhabt.

Alternative 1

class History(models.Model):
    field1 = models.ForeignKey(Request)
    field2 = models.BooleanField()
    field3 = models.DateTimeField()

    def __unicode__(self):
        return str(self.field1.id)

    class Meta: #
        ordering = ['-field3']

    def insert_history(self):
        # Here I will have some business logic to insert the data to the history model

Um Daten in das History-Modell einzufügen, muss immer die Funktion "insert_history" verwendet werden.

Meine Fragen hier sind:

Der Code oben ist richtig?

Wenn ja, wie kann ich die "insert_history" aus einer Ansicht aufrufen?


Alternative 2

Ich habe eine andere Alternative, die ich getestet habe und die funktioniert, sich aber nicht richtig anfühlt. Der Code sieht folgendermaßen aus:

class History(models.Model):
    field1 = models.ForeignKey(Request)
    field2 = models.BooleanField()
    field3 = models.DateTimeField()

    def __unicode__(self):
        return str(self.field1.id)

    class Meta: #
        ordering = ['-field3']

def insert_history(field1, field2, field3):
    # Here I will have some business logic to insert the data to the history model

Und ich nenne es so:

from app.models import insert_history

insert_history('1', True, 'some_date')

wie geht das richtig? Wenn die Alternative 1 korrekt ist, wie kann ich "insert_history" aus einer Ansicht aufrufen?

Freundliche Grüße,

12
André

Verwendet insert_history self? Oder erstellt es ein neues Verlaufsobjekt?

Wenn es ein neues Objekt erstellt, würde ich es so machen:

class History(models.Model):
    @classmethod
    def insert_history(cls, field1, field2, field3):
        # Here be code

Um es zu nennen

from app.models import History
History.insert_history(field1, field2, field3)

Übrigens ist der herkömmliche Name für eine Methode zum Erstellen neuer Objekte create. Schauen Sie sich auch https://docs.djangoproject.com/de/1.9/ref/models/instances/#creating-objects an.

10
skoll

Ich denke, dass es am besten geeignet ist, für diese Probleme den benutzerdefinierten Manager https://docs.djangoproject.com/en/dev/topics/db/managers/ zu verwenden.

1
sirfilip

Wählen Sie einfach Ihre History-Instanz aus (z. B. mit Primärschlüssel 1):

hist = History.objects.get(pk=1)

... und rufen Sie Ihre Methode mit der Variablen hist auf:

hist.insert_history(...)
1
Steinar Lima

Um Daten in das Verlaufsmodell einzufügen, muss ich immer die Funktion insert_history verwenden.

Ja, es wird das Feld3 setzen, eine Datums- und Uhrzeitangabe, basierend auf einer Logik, die ich in insert_history schreiben werde.

Am einfachsten ist es, die Methode save zu überschreiben :

class History(models.Model):
    field1 = models.ForeignKey(Request)
    field2 = models.BooleanField()
    field3 = models.DateTimeField()

    def __unicode__(self):
        return unicode(self.field1.id) # __unicode__ should return unicode,
                                       # not string.

    class Meta: #
        ordering = ['-field3']

    def save(self, *args, **kwargs):
        self.field3 = your calculated value
        super(History, self).save(*args, **kwargs)

Wenn Sie jetzt Ihre Methode speichern, ist der Wert von field3 das Ergebnis der Berechnung in Ihrer benutzerdefinierten Speichermethode. Sie müssen nichts in Ihren Ansichten ändern, damit dies funktioniert.

1
Burhan Khalid

Nur um die Antwort von @burhankhalid zu erweitern, da ich aufgrund der hohen Rep-Anforderungen keinen Kommentar abgeben konnte, musste ich beim Speichern meines Modells ein anderes ändern, aber die von Burhan Khalid vorgeschlagene Lösung half mir beim Start.

Das Modell, das ich modifizieren musste, hatte einen Verweis von diesem

Mein Vorschlag geht davon aus, dass Request ein 'attrib1' hat und versucht, den Wert aus History.field2 zu speichern

class History(models.Model):
field1 = models.ForeignKey(Request)
field2 = models.BooleanField()
field3 = models.DateTimeField()

def __unicode__(self):
    return unicode(self.field1.id) # __unicode__ should return unicode,
                                   # not string.

class Meta: #
    ordering = ['-field3']

def save(self, *args, **kwargs):
    self.field3 = your calculated value
    self.field1.attrib1 = self.field2  # for instance
    self.field1.save()  # don't forget to save the other 
    super(History, self).save(*args, **kwargs)

Das gesamte Konzept, die save () -Methode neu zu schreiben und andere Objekte zu ändern (und zu speichern), machte also auch den Unterschied

0
NKortesmaa