2017-06-14 89 views
0

我期待创建一个数据库结构,其中每个组都有一个链接到单个策略。OneToOneField抽象模型

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

  • 可以有额外的属性
  • 绝对有一种方法称为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 model utils的东西,我猜)我可以在运行时获得策略的“真实”类型,但这对我来说并不合适。

我读过一些关于泛型关系的知识,但这是“正确”的方式吗?我只是想在我走上一条或另一条道路之前加以确定。

回答

0

我会让Policy成为主模型,而PolicyA成为proxymodel。

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 
+0

我不知道我明白你在这里要做什么。 首先,什么是内容以及PolicyA为什么从它派生出来?其次,如果我(例如)调用my_group.policy.do_this(),当然这会调用Policy的do_this()方法,而不是PolicyA的方法 - 即使实际的策略类是PolicyA? 我不确定你在这里解决了这个问题。 – bodger