0

私のモデルは次のように構成されています。

class Animal(models.Model):

  first_name = models.CharField(max_length=128, unique=True)

class Cat(Animal):

  def make_sound(self):
    return "mreooooow"

class Dog(Animal):

  def make_sound(self):
    return "AARF!"

class EvilMonkey(Animal):

  def make_sound(self):
    return "muahahaha ..."

ご覧のとおり、さまざまな動物は「動物」と呼ばれるクラスから継承しています。各サブクラスにはメソッドもありmake_soundます。

しかし、私の見解ではmake_sound、一般的な動物を呼び出すと、Djangoは、Animalオブジェクトには、というメソッドがないと不平を言いますmake_sound。これは、のサブクラスのオブジェクトのみがメソッドを持っているため、理にかなっていますAnimal

Animalのサブクラスのすべてのオブジェクトがメソッドを持っていることを保証できることをどういうわけかDjangoに伝えることができますmake_soundか?Javaインターフェイスのようなものを介して?Djangoのドキュメントに「フィールド名の「非表示」は許可されていません」と記載されていることは知っていますが、メソッドのオーバーライドは継承にとって非常に基本的であるため、Djangoはそれをサポートする必要があると思います。

my_animal.cat.make_sound()動物のオブジェクトを一般的に扱いたいので、具体的に言う必要はありません。

4

2 に答える 2

1

この記事はいくつかの洞察を提供します。もっと簡単な方法があれば便利でしょう。「より効率的なテクニック」は有望に見えます。

于 2013-01-21T21:57:45.037 に答える
1

問題は、Animalがmake_soundについて知らないということではありません。DjangoでAnimalを要求すると、それが得られます。そのAnimalが基本クラスではなく「実際に」サブクラスである場合でも、基本インスタンスのみが返されます。これは、Djangoがクエリを実行して、サブクラス化されたテーブルのいずれかに関連アイテムがあるかどうかを検出しようとしないためです。これは、不要なクエリが多数あるため、おそらくバランスが取れていることです。

唯一行うことは、基本クラスにある動物のタイプを記録し、そこから関連するサブクラスを取得するメソッドを作成することです。

于 2013-01-21T22:01:15.647 に答える