2016-09-15 55 views
0

我正在寻找正确的方法来覆盖子类的create()方法。Django覆盖模型子类创建方法

基本上我这样做:

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) 

然而我们不能覆盖模型的__init__()方法。

我只想让一些字段在基类的方法中分配。

是否有适当的方法使用create()方法来完成此操作?

当然,我可以自定义的基类的create方法,但我要的是对创建的,这使得从this question

+1

可能复制到http://stackoverflow.com/questions/39483184/django-model-id-turns-into-a-tuple/39483272#39483272和http://stackoverflow.com/questions/843580 /写一个初始化的函数将在django模型中使用#843740 –

+0

是的,你可以使用一个简单的classmethod,如答案 – armak

+0

@SardorbekImomaliev解释很相似,我认为。但在我的情况下,我需要同时调用基础模型的方法。 – SolessChong

回答

1

不同的情况调用Base.create和A.create在同一时间我会做这样的事情。

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

这是一个正确的答案,实际上我正在使用相同的工作。不过,我仍然在寻找一种优雅的方式。谢谢你们一样。 – SolessChong