2016-05-23 13 views
0

Ich habe ein paar Modelle im Projekt (modelA, modelB, modelC), und ich möchte die Speichermethode in jeder Klasse überschreiben, damit sie für alle anwendbar ist.Überschreiben der Speichermethode in einer anderen Klasse

Also mache ich so etwas wie dies für ein Modell:

class modelA(CustomClass, models.Model): 
    ...... 

class CustomClass(): 
    def save(self, *args, **kwargs): 
     # do something 
     # and now I want to call modelA.save() method 
     super(modelA, self).save(*args, **kwargs) 
     # super is used here as example 

Die Frage ist, ob es überhaupt möglich ist, und wenn ja, wie kann ich dies tun?

+0

Soll 'CustomClass' eine gemeinsame Klasse zwischen den Modelltypen sein? – Sayse

Antwort

2

Ja, definieren Sie einfach Ihre Speichermethode in der benutzerdefinierten Klasse und stellen Sie sicher, dass Sie die Basismethode bei jedem weiteren Überschreiben der Speichermethode aufrufen.

Standardmäßig verwendet das Modell die models.Model implementation of save. Wenn Sie super aufrufen (über super(CustomClass, self)..), rufen Sie das übliche Speicherverhalten auf.


Beachten Sie die oben auf MODELA erben von benutzerdefinierten Klasse abhängt, die von Modell erbt, das ich es ursprünglich gedacht war .. tun

class modelA(CustomClass): 
    ...... 

class CustomClass(models.Model): 
    .... 
+0

Auch darüber nachgedacht, denke ich, dass etwas wie models.Model.save (Self, Args, Kwargs) in CustomClass.save auch Lösung –

+0

@ user3581394 - Sie tun dies sowieso durch Aufruf der Basisklasse 'Methode. – Sayse

0
class CustomClass(models.Model): 

    def save(self, *args, **kwargs): 
     # do things needed generally 2.) 
     super(CustomClass, self).save(*args, **kwargs) 


class ModelA(CustomClass): 

    def save(self, *args, **kwargs): 
     # do things specific for ModelA 1.) 
     super(ModelA, self).save(*args, **kwargs) 
     # do things specific for ModelA 3.) 

Zahlen vor Klammern zeigen Ausführungsreihenfolge für den Fall des Sparens

0

Ich neige dazu, Mixins (kompositionsbasierte Mehrfachvererbung) für Fälle wie diese zu verwenden, aber es ist Ihr Anruf. Es könnte so einfach sein, wie eine CustomSaveMixin Klasse zu deklarieren, die von object erbt, mit der save Überschreibung, die Sie wollen. Auf diese Weise können Sie die Basis-Unterklasse Model für die Methoden beibehalten, die Sie nicht überschreiben müssen. Zum Beispiel:

class CustomSaveMixin(object): 
    def save(self, *args, **kwargs): 
     # ... 
     # If you're preserving existing Django save hooks (most likely). 
     super(CustomSaveMixin, self).save(*args, **kwargs) 

class ExampleModel(models.Model, CustomSaveMixin): 
    # ... 

Allerdings habe ich diesen Ansatz nicht versucht (Subklassen object), aber ich weiß, dass es für die Klasse basierter Ansichten funktioniert. Die offiziellen Dokumente schlagen vor, eine Mixinklasse zu deklarieren, die models.Model erweitert, aber ich würde beide Ansätze versuchen. https://docs.djangoproject.com/en/1.9/topics/db/models/#multiple-inheritance

Verwandte Themen