2017-06-14 141 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