2016-09-15 1 views
0

Ich suche nach Möglichkeiten, die create() Methode einer Unterklasse zu überschreiben.Django überschreiben Modellunterklasse create method

Im Grunde mache ich das:

class Base(models.Model): 
    field1_base = models.IntegerField() 
    def __init__(self, field1_base): 
     # LOGICS 
     self.field1_base = field1_base 

class A(Base): 
    field2_sub = models.IntegerField() 
    def __init__(self, field2_sub, field1_base): 
     # LOGICS 
     self.field2_sub = field2_sub 
     super(A, self).__init__(field1_base) 

A(field2_sub=1, field1_base=2) 

jedoch können wir die __init__() Methode eines Modells nicht außer Kraft setzen.

Ich möchte nur einige Felder in der Basisklasse Methoden zugewiesen werden.

Gibt es einen geeigneten Weg, dies zu tun mit create() Methode?

Natürlich kann ich benutzerdefinierte create Methode der Basisklasse, aber was ich will, ist Base.create und A.create zugleich auf die Schaffung von A zu berufen, die die Situation anders aus this question macht

+1

möglich Duplikat zu http://stackoverflow.com/questions/39483184/django-model-id-turns-into-a-tuple/39483272#39483272 und http://stackoverflow.com/questions/843580/schreiben-ein-init-funktion-zu-verwendet-in-django-modell # 843740 –

+0

yup können Sie eine einfache Klassenmethode verwenden, wie in der Antwort – armak

+0

@SardorbekImomaliev Ganz ähnlich, denke ich. In meinem Fall muss ich jedoch die Methoden des Basismodells gleichzeitig aufrufen. – SolessChong

Antwort

1

Ich würde so etwas tun.

class Base(models.Model): 
    field1_base = models.IntegerField() 

    def initialize(self, *args, **kwargs): 
     self.field1_base = kwargs['field1_base'] 

    @classmethod 
    def create(cls, *args, **kwargs): 
     # LOGICS 
     self = cls() 
     self.initialize(*args, **kwargs) 
     return self 

class A(Base): 
    field2_sub = models.IntegerField() 

    def initialize(self, *args, **kwargs): 
     super(A, self).initialize(*args, **kwargs) 
     self.field2_sub = kwargs['field1_base'] 

A.create(field2_sub=1, field1_base=2) 
+0

Es ist eine richtige Antwort, und tatsächlich verwende ich die gleiche Arbeit um. Ich suche jedoch immer noch nach einer eleganten Art und Weise, dies zu tun. Trotzdem danke. – SolessChong

Verwandte Themen