2017-02-15 62 views
0

我正在開發一個項目,我需要定義一些模型,這些模型具有一些與其中的業務邏輯相關的功能,例如,如何在從數據庫讀取數據時處理數據。如何繼承django模型只是爲了覆蓋函數?

我想從同一個父模型繼承多個模型,在每個模型中我重寫了一些特定的函數。我不希望爲每個新模型創建一個新表,因爲我只重寫功能而不添加任何字段。如何實現這一目標?

代理模型沒有幫助,因爲我無法從數據庫對象中檢索相應的類。

例子: -

class ParentModel(models.Model): 
    f1=fields.IntegerField() 

    def processing_func1(self): 
     <default func1 functionality> 

    def processing_func2(self): 
     <default func2 functionality> 

class ChildModel1(models.Model): 

    def processing_func1(self): 
     <overridden func1 functionality> 

class ChildModel2(models.Model): 

    def processing_func2(self): 
     <overridden func2 functionality> 

我需要孩子的模型是通過ParentModel訪問。例如,如果我做ParentModel.objects.all()我得到ChildModels的對象。對於正常的模型繼承,我使用django-model-utils來實現。

+2

你是什麼意思'無法從數據庫對象中檢索合適的類?如果將ChildModels定義爲代理,則可以使用數據庫,因爲它是父級模型。代理模型正好適合您的情況。 – Raz

+0

https://docs.djangoproject.com/en/1.10/topics/db/models/#proxy-models – abrunet

+0

我需要通過ParentModel訪問子模型。例如,如果我做ParentModel.objects.all()我得到ChildModels的對象。對於正常的模型繼承,我通過說ParentModel.object.select_subclasses() –

回答

0

你需要的是這裏一個混合,使抽象類從Django模型繼承的屬性

這樣的事情。

class UtilMixin(models.Model): 

    def processing_func1(self): 
     <default func1 functionality> 

    def processing_func2(self): 
     <default func2 functionality> 

    class Meta: 
     abstract = True 


class ChildModel1(UtilMixin): 

    def processing_func1(self): 
     <overridden func1 functionality> 

class ChildModel2(UtilMixin): 

    def processing_func2(self): 
     <overridden func2 functionality> 
+0

使用django-model-utils來實現這一點。這仍然爲我的每個新類創建一個新表。 –

+0

哦,對不起,我的答案與這一個部分相關。 –