1

Concert のインスタンスを使用すると、バインドされていないメソッド do_stuff() を最初の引数として Concert インスタンスで呼び出す必要があります (代わりに ModelBase インスタンスを取得)

models.py:

class Event(models.Model):
    def do_stuff(self):
        response self.do_specific_stuff(self)


class Concert(Event):
    def do_specific_stuff(self):
        ...

class Party(Event):
    def do_specific_stuff(self):
        ...

ビュー:

def index(request):
    x = Concert.objects.get(name='Jack White @ Oakland')
    output = x.do_stuff()
    return HttpResponse(output)

私の目標は、すべてのイベントをループし、イベントの種類に基づいて do_specific_stuff 子クラス メソッドを実行することです。

4

3 に答える 3

3

Djangoでは、継承によって複数テーブルの継承がトリガーされますが、Pythonではポリモーフィズムは得られません。これは、データスキーマとオブジェクトモデルの間の完全な対応を提供していないORMの単なるインスタンスです。

つまり、イベントをクエリすると、それらの一部が実際にコンサートオブジェクトであるかパーティーオブジェクトであるかに関係なく、多数のイベントオブジェクトが返されます。手動でダウンキャストする必要があります。concertイベントがコンサートの場合、対応するコンサートサブクラスを指すと呼ばれる属性があります。パーティーも同様です。通常のイベントの場合、どちらの属性もありません。

イベントで次のプロパティを使用して、オブジェクトを自動的にダウンキャストできます。

@property
def as_child_class(self):
    """Casts this object to its subclass, if possible"""

    if hasattr(self, 'concert'):
        return self.concert
    elif hasattr(self, 'party'):
        return self.party
    else:
        return self

次に、次のようなことを行うことができます。

for event in Event.objects.all()
    event.as_child_class.do_specific_stuff()

同様の質問が以前に出てきました:

そして、このリンクには他のアイデアがいくつかあります。

于 2012-11-20T15:27:24.930 に答える
0

Eventあなたのモデルは継承専用であるように思われるので、抽象化する必要があります:

class Event(models.Model):
    class Meta:
        absract = True

    def do_stuff(self):
        response self.do_specific_stuff()

    def do_specific_stuff(self):
        raise NotImplemented


class Concert(Event):
    def do_specific_stuff(self):
        ...


class Party(Event):
    def do_specific_stuff(self):
        ...

の使用法については間違っているかもしれませんEventが、そうであった場合、Eventモデルを抽象化するとプレーンクラスのようになります。つまり、そのようなモデルに対してデータベースアクションは実行されません。

お役に立てれば!:)

于 2012-11-20T15:46:17.963 に答える
0

まず、テンプレートメソッドを参照してください

次に、Event クラスは抽象化する必要があります。

class Event:
   def __init__:
       raise NotImplemented('This class is abstract')

3 番目に、 Single Table InheritanceおよびClass Table Inheritanceパターンを参照してください。そしてdjango-ORMのパターンの実現 頑張ってください=

于 2012-11-20T16:18:22.240 に答える