我可以在Django模型中封装其他类以获得更易读的代码吗?

时间:2018-03-22 16:17:56

标签: django django-models

我有一个Django模型,它有很多字段,只是简单地列出它们看起来都很难看。其中一些字段可以组合在一起,因为它们具有相同的属性,我想将它们放在单独的类或模型中,并将其封装在更大的模型中。举个例子,是否可以这样做:

class BigModel(models.Model):
    field1 = models.IntegerField()
    field2 = models.BooleanField()
    ...
    grouped_data = SmallClass()

class SmallClass():
    field1 = models.CharField(max_length=10)
    field2 = models.IntegerField()

我希望通过这个实现基本相同的事情,就好像我只是简单地列出了BigModel中的所有字段,但代码更易读。

我想到的另一种可能的方法是将SmallClass变为SmallModel,并让OneToOneField引用BigModel。例如:

class BigModel(models.Model):
    field1 = models.IntegerField()
    field2 = models.BooleanField()
    ...
    grouped_data = SmallClass()

class SmallModel(models.Model):
    big_model = models.OneToOneField(BigModel)
    field1 = models.CharField(max_length=10)
    field2 = models.IntegerField()

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

不,第一个人根本不会工作。第二个会起作用,但会是一个单独的表。

您可以使用一个或多个mixins:

class SmallClass(models.Model):
    field1 = models.CharField(max_length=10)
    field2 = models.IntegerField()

    class Meta:
         abstract = True


class BigModel(SmallClass, models.Model):
    ...