Django OneToOneField到抽象模型

Django OneToOneField到抽象模型,django,django-models,abstract-class,Django,Django Models,Abstract Class,我希望创建一个数据库结构,其中每个组都有一个指向单个策略的链接 策略可以是多种不同类型中的一种,每种类型:- 可能有额外的属性 肯定会有一个名为do_this()的方法和一个名为do_that()的方法 随着时间的推移,将创建更多的保单,每个保单都有自己的属性等 我最初的直觉是,策略是一个抽象类,带有指向组的链接和方法的存根:- class Policy(models.Model): group = models.OneToOneField(Group) class Met

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

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

  • 可能有额外的属性
  • 肯定会有一个名为do_this()的方法和一个名为do_that()的方法
随着时间的推移,将创建更多的保单,每个保单都有自己的属性等

我最初的直觉是,策略是一个抽象类,带有指向组的链接和方法的存根:-

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模型utils之类的东西)我可以在运行时获得“真实”类型的策略,但我觉得这不对


我读过一些关于一般关系的书,但这是“正确”的方法吗?我只是想在我沿着一条或另一条道路疾驰之前确定一下。

我会将策略作为主要模型,将策略作为代理模型

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

我会将策略作为主要模型,将策略作为代理模型

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

我不知道我是否明白你在这里想做什么。首先,什么是内容?为什么PolicyA从中派生?其次,如果我(例如)调用我的_group.policy.do_this(),这肯定会调用policy的do_this()方法,而不是PolicyA的方法-即使policy的真正类是PolicyA?我不确定你是否已经解决了这个问题。我不确定我是否理解你在这里试图做什么。首先,什么是内容?为什么PolicyA从中派生?其次,如果我(例如)调用我的_group.policy.do_this(),这肯定会调用policy的do_this()方法,而不是PolicyA的方法-即使policy的真正类是PolicyA?我不确定你已经解决了这个问题。