首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OneToOneField到抽象模型

OneToOneField到抽象模型
EN

Stack Overflow用户
提问于 2017-06-14 09:20:40
回答 1查看 476关注 0票数 1

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

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

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

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

我最初的直觉是,Policy是一个抽象类,它与组和方法的存根有链接:-

代码语言:javascript
复制
class Policy(models.Model):
    group = models.OneToOneField(Group)

    class Meta:
        abstract = True

    def do_this():
        raise NotImplementedError()

    def do_that():
        raise NotImplementedError()

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

代码语言:javascript
复制
class PolicyA(Policy):
    new_attribute = models.IntegerField()

    def do_this():
        # implementation A

    def do_that():
        # implementation A

但是如果我这样做的话,我就没有办法向一个组索取它的策略,因为策略是抽象的。

如果删除抽象设置,那么(使用类似django模型的utils,我猜)我可以在运行时获得“真实”类型的策略,但这对我来说并不合适。

我读过一些关于一般关系的文章,但这是不是“正确”的方式呢?我只想在我离开一条或另一条路之前确定一下。

EN

回答 1

Stack Overflow用户

发布于 2017-06-14 20:02:26

我会把政策作为一个主要模型,而PolicyA则是一个proxymodel。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44540586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档