OneToOneField抽象模型

时间:2017-06-14 09:20:40

标签: django django-models abstract-class

我希望创建一个数据库结构,其中每个组都有一个指向单一政策的链接。

政策可以是各种不同类型中的一种,每种类型: -

  • 可能有额外的属性
  • 肯定会有一个名为do_this()的方法和一个名为do_that()的方法

随着时间的推移,将会创建更多的Policys,每个都有自己的属性等。

我最初的本能是将Policy作为一个抽象类,其中包含一个返回Group的链接和方法的存根: -

class Policy(models.Model):
    group = models.OneToOneField(Group)

    class Meta:
        abstract = True

    def do_this():
        raise NotImplementedError()

    def do_that():
        raise NotImplementedError()

然后,不同的策略类型可以添加自己的属性,但必须实现接口。

class PolicyA(Policy):
    new_attribute = models.IntegerField()

    def do_this():
        # implementation A

    def do_that():
        # implementation A

但如果我这样做,那么由于政策是抽象的,我无法向集团询问其政策。

如果我删除抽象设置,那么(使用类似django model utils的东西,我猜)我可以得到"真实"在运行时对策略的类型,但对我来说感觉不对。

我已经读过一些关于通用关系的内容,但是"对"怎么去这里?我只是想确定在我开辟一条道路或其他道路之前。

1 个答案:

答案 0 :(得分:0)

我将Policy作为主要模型,PolicyA作为代理模型。

from model_utils.managers import QueryManager
class Policy(models.Model):
    group = models.OneToOneField(Group)
    content_type = models.SmallIntegerField(choices=settings.CONTENT_TYPE,editable=False)
    def __init__(self, *args, **kwargs):
        super(Policy, self).__init__(*args, **kwargs)
        self.content_type = self.DEFAULT_CONTENT_TYPE

class PolicyA(Content):
    DEFAULT_CONTENT_TYPE = settings.A_TYPE
    objects = QueryManager(content_type=DEFAULT_CONTENT_TYPE)
    class Meta:
        proxy = True