子类化Django模型仅用于行为

时间:2018-12-19 09:43:36

标签: django django-1.8

我有一个模型Property,其中包含某些字段和相关方法:

class Property(models.Model):
    table = models.ForeignKey(Table)
    field1 = models.CharField()
    field2 = models.IntegerField()
    field3 = models.BooleanField()

    class Meta:
        abstract = True

    def post():
        pass

但是从概念上讲,我有一定数量的列类型。在各个字段中没有区别,只是在实现某种方法的行为上没有区别:

class Property1(Property):
    def post():
        # execute behavior for Property1
        pass

class Property2(Property):
    def post():
        # execute behavior for Property2
        pass

以此类推。

如果我将Property变成一个抽象的基本模型类,让其余的继承它,那么对于每个属性,我将得到不同的表。我不确定我是否想要那个。所有表看起来都一样,这是多余的。

但是同时运行查询以获取表中的所有属性并调用post()时,我希望执行相应的行为:

for prop in table.property_set.all():
    prop.post()

我有什么选择?

1 个答案:

答案 0 :(得分:3)

为此,您可以使用proxy模型。尝试这样:

class Property(models.Model):
    table = models.ForeignKey(Table)
    field1 = models.CharField()
    field2 = models.IntegerField()
    field3 = models.BooleanField()


class Property1(Property):
    class Meta:
       proxy = True

    def post():
        # execute behavior for Property1
        pass

class Property2(Property):

    class Meta:
       proxy = True

    def post():
        # execute behavior for Property2
        pass

根据文档:

  

MyPerson类与其父Person类在同一数据库表上操作。特别是,也可以通过MyPerson访问Person的任何新实例,反之亦然:

因此您可以获取如下的代理实例:

Property1.objects.filter(pk__in=table.property_set.all())