2017-06-14 17 views
0

各グループにの単一のポリシーへのリンクがあるデータベース構造を作成したいと考えています。抽象モデルへのOneToOneField

Aポリシーは、様々な異なるタイプのの1、その各でき

: -

  • 追加の属性
  • を有することができる間違いはdo_this(というメソッドを持つことになります)と呼ばれる1時間の経過do_that()

、より多くのPolicysが作成されるなど、独自の属性を持つ各

これで

私の最初の本能はポリシーメソッドのグループとスタブへのバックリンクを持つ抽象クラスであることで行くことにした: -

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のようなものを使用すると、実行時に「本当の」タイプのポリシーを取得できますが、それは私には気になりません。

私は一般的な関係について少しは読んだことがありますが、ここに行く "正しい"方法ですか?私はちょうど私が1つの道または他を降りる前に確かめたいと思う。

答えて

0

私はポリシーをメインモデルとし、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 
+0

私はあなたがここで何をしようとしているのか分かりません。 まず、コンテンツとは何ですか?また、なぜPolicyAはそれから派生していますか? 第2に、my_group.policy.do_this()を呼び出すと、必ずポリシーの実際のクラスがPolicyAであっても、これはPolicyAのdo_this()メソッドを呼び出します。 ここで問題を解決したかどうかはわかりません。 – bodger

関連する問題