2017-09-12 1 views
2

(mit Django 1.11.5)Django - Benutzerdefinierte Methode in Modell speichern

Traditionell habe, habe ich immer ein Modell wie folgt:

class Animal(models.Model): 
    is_hungry = models.BooleanField(default=True) 

Dann Änderungen wie folgt:

animal = Animal() 
animal.save() 

animal.is_hungry = True 
animal.save() 

Vor kurzem sah ich einen Freund, ein Modell mit einem benutzerdefinierten Speichermethode definieren:

class Animal(models.Model): 
    is_hungry = models.BooleanField(default=True) 

    def feed_animal(self): 
     self.is_hungry = False 
     self.save() 

Und ruft diese Methode wie erwartet zu funktionieren scheint:

>>> from testapp.models import Animal 
>>> a = Animal() 
>>> a.save() 
>>> a.is_hungry 
True 
>>> 
>>> a.feed_animal() 
>>> a.is_hungry 
False 

es irgendwelche Vorteile/Nachteile, wie eine benutzerdefinierte Speichermethode in der Modelldefinition bei der Definition? Gibt es einen Grund, das Objekt .save() direkt anzurufen?

+0

gibt es keine Nachteile, aber es könnte nicht best practice seine implizit zu haben spart in Methoden Modell begraben. Es wäre sauberer, die feed_animal-Methode zu definieren, die nur den Status des Modellobjekts ändert und das Speichern dem view.py-Code überlässt. –

+0

@ Jarek.D - Sie würden immer noch empfehlen, die 'feed_animal()' Methode beizubehalten, entfernen Sie einfach die 'self.save()'? –

+0

Ja, aber wenn feed_animal() nur den Status des Attributs wirklich ändert, ist es nicht sehr pythonisch - mach einfach a.is_hungry = Falsch –

Antwort

3

Es gibt keine Nachteile, aber es ist möglicherweise keine bewährte Methode, implizite Speicher in die Methoden des Modells einzubetten. Es wäre sauberer sein feed_animal Methode zu definieren, die nur den Zustand des Modellobjekts ändert und das Speichern auf den view.py Code verlassen:

# model.py 
class Animal(models.Model): 
    is_hungry = models.BooleanField(default=True) 

    def feed_animal(self): 
     # makes sense if ther's more to it than just setting the attribute 
     self.is_hungry = False 

# view.py 
a = Animal() 
a.feed_animal() 
a.save() 

Das Muster mit der Definition benutzerdefinierten Methoden speichern ist in Django verstanden als zwingenden speichern speichern Methode der Modellklasse in der Kinderklasse und Sinn machen, wenn Sie auf das Objekt Verhalten permamently ändern müssen:

# model.py 
class Animal(models.Model): 
    is_hungry = models.BooleanField(default=True) 

    def feed_animal(self): 
     # makes sense if ther's more to it than just setting the attribute 
     self.is_hungry = False 

    # let say we need to save only well fed animals 
    def save(self, *args, **kwargs): 
     self.feed_animal()   
     super(Model, self).save(*args, **kwargs) 
1

Dies hängt von Ihren Anwendungsfällen ab.

In dem oben angegebenen Beispiel, wenn Tier gefüttert wird, wird es schließlich das Tier (Objekt) nicht hungrig enden. Daher wird in feed_animal Funktion nach dem Einrichten self.is_hungry (wo Self ist das Objekt selbst), self.save aufgerufen, um den endgültigen Zustand des Objekts zu speichern.

Verwandte Themen