1

これは重複しているように聞こえるかもしれませんが、そうではないと思います。

質問者がそこで行ったことと少し似たようなことをする必要があります: django model polymorphism with proxy inheritance

私の親は一連のメソッドを実装する必要があります。それらを MethodA()、MethodB() と呼びましょう。これらのメソッドは直接使用されることはなく、常に子モデルを介して呼び出されます (ただし、抽象クラスはさまざまな理由から使用できません)。

しかし、これはよりトリッキーになるところです:

各子モデルは特定のモジュール (moduleA、moduleB) から継承し、それらはすべて同じメソッド名を実装しますが、何かが異なります。呼び出しは親モデルを通じて行われ、フィールドの値に応じて子モデルにリダイレクトされます

あまり明確ではないと思うので、理解に役立つ疑似コードをいくつか示します

from ModuleA import CustomClassA
from ModuleB import CustomClassB

class ParentModel(models.Model):

TYPE_CHOICES = (
  ('ChildModelA', 'A'),
  ('ChildModelB', 'B'),
)

    #some fields
    type = models.CharField(max_length=1, choices=TYPE_CHOICES)
    def __init__(self, *args, **kwargs):
        super(ParentModel, self).__init__(*args, **kwargs)
        if self.type:
          self.__class__ = getattr(sys.modules[__name__], self.type)

    def MethodA():
      some_method()

    def MethodB():
      some_other_method()

class ChildModelA(ParentModel, CustomClassA):
    class Meta:
      proxy = True

class ChildModelB(ParentModel, CustomClassB):
    class Meta:
      proxy = True

ModuleA では:

class CustomClassA():
    def some_method():
      #stuff

    def some_other_method():
      #other stuff

ModuleB で:

class CustomClassB():
    def some_method():
      #stuff

    def some_other_method():
      #other stuff

現時点での問題は、クラスの変更は機能するが、ChildModelA または B から継承されないことです。

これは可能ですか?はいの場合、どのように機能させることができますか? いいえの場合、繰り返しをあまり行わずにエレガントに行うにはどうすればよいですか?

4

1 に答える 1

0

プロキシ モデルは、厳密に 1 つの非抽象モデル クラスから継承する必要があります。と の両方が抽象的CustomClassではないようです。属性が定義されていないため、抽象化ParentModelすることをお勧めします。CustomClassこれについては、https ://docs.djangoproject.com/en/3.2/topics/db/models/#proxy-models で詳細に説明されています。

于 2021-04-22T10:30:11.977 に答える