2012-03-23 124 views
2

我们有django项目,我们发现有些模型变得巨大。Django模型 - 继承成本

class BigModel(models.Model): 
    """ 
    Large set of fields 
    """ 
    field1 = models.IntegerField() 
    field2 = models.IntegerField() 
    field3 = models.IntegerField() 
    ... 
    fieldN = models.IntegerField() 
    """ 
    Large set of methods 
    """ 
    def method1(self): pass 
    def method2(self): pass 
    def method3(self): pass 
    ... 
    def methodN(self): pass 

我想用方法列表将BigModel类分成更小的类和方法列表。但是在整个项目中,我们参考了BigModel类。

所以我的想法是采用简单的方法来做到这一点:

  1. 鸿沟BigModel类为BigFieldsBigMethods。从BigFields继承 BigMethods。从BigMethods继承BigModel
  2. 通过创建代理模型并用代码替换对BigModel的引用 - 减小了BigMethods类的大小。

因此,在重构我们的代码的那一刻将是这样的:

class BigFields(models.Model): 
    class Meta: 
     abstract = True 
    """ 
    Large set of fields 
    """ 
    field1 = models.IntegerField() 
    field2 = models.IntegerField() 
    field3 = models.IntegerField() 
    ... 
    fieldN = models.IntegerField() 

class BigMethods(BigFields): 
    class Meta: 
     abstract = True 
    """ 
    Large set of methods 
    """ 
    def method1(self): pass 
    def method2(self): pass 
    def method3(self): pass 
    ... 
    def methodN(self): pass 

class BigModel(BigMethods): 
    pass 
  • 它将如何影响性能?
  • python中一级继承的成本是多少?
  • 元类是否会影响继承的成本?
+0

如果需要谈“字段N”那么是时候进一步规范化了。 – 2012-03-23 17:32:31

+0

我认为method1,method2等仅仅是为了举例的目的,而不是他的领域/方法的真实姓名 – jterrace 2012-03-23 17:57:09

+0

@jterrace:不*相当*我在... – 2012-03-23 18:46:44

回答

3

如果在模型中有这样的顺序字段,解决方案不是继承,而是将这些字段分解为单独的模型并创建一个一对多的关系。用示例模型很难说清楚,所以我将使用我正在开发的一个项目中的一个。

的原始模型看起来是这样的:

class Page(models.Model): 
    title = models.CharField(max_length=256) 
    section_1_title = models.CharField(max_length=256) 
    section_1_content = models.TextField() 
    section_2_title = models.CharField(max_length=256) 
    section_2_content = models.TextField() 
    section_3_title = models.CharField(max_length=256) 
    section_3_content = models.TextField() 
    ... 

显然,这是保持一个噩梦,所以我把它改成如下:

class Page(models.Model): 
    title = models.CharField(max_length=256) 

class Section(models.Model): 
    page = models.ForeignKey(Page, related_name='sections') 
    title = models.CharField(max_length=256) 
    content = models.TextField() 
    order = models.PositiveIntegerField() 

    class Meta: 
     ordering = ['order'] 
     order_with_respect_to = 'page' 
+0

感谢您的回答。序列是例如:)我有很多不同名称的字段,并且db相对正常化。问题在于我有很多方法,并且在项目开始时我并不知道代理模型 - 所以我的模型类太聪明了。我想减少它。 – 2012-03-23 19:53:13

+0

对不起。那么,我会留下我的后代答案,但在你的问题中不应该有任何问题。抽象模型比真正的继承更接近mixin。你的数据库将保持不变,并没有真正的性能点击说。 – 2012-03-23 20:19:12