我希望创建一个数据库结构,其中每个组都有一个指向单一政策的链接。
政策可以是各种不同类型中的一种,每种类型: -
随着时间的推移,将会创建更多的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的东西,我猜)我可以得到"真实"在运行时对策略的类型,但对我来说感觉不对。
我已经读过一些关于通用关系的内容,但是"对"怎么去这里?我只是想确定在我开辟一条道路或其他道路之前。
答案 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