(ジャンゴ 1.x、パイソン 2.6.x)
私は次のようなモデルを持っています:
class Animal(models.Model):
pass
class Cat(Animal):
def __unicode__(self):
return "This is a cat"
class Dog(Animal):
def __unicode__(self):
return "This is a dog"
class AnimalHome(models.Model):
animal = models.ForeignKey(Animal)
これは仮想クラスであるはずなので、Animals をインスタンス化していません。私は Cats と Dogs をインスタンス化しましたが、AnimalHome の管理ページでは、動物の選択は、2 つのサブクラスに対して定義した __unicode__ ではなく、"Animal オブジェクト" (デフォルトの __unicode__() だと思います) として表示されます。ヘルプ。
抽象基本クラスの問題は、この質問に対する赤いニシンだと思います。Animal が抽象化されていなかったとしても、何らかの理由で、ForeignKey が Animal で定義されており、そのサブクラスの 1 つではなく、サブクラスの代わりにスーパークラス メソッドが呼び出されているという問題があります。OO プログラミングで object.method() を呼び出すと、最下位のサブクラスの実装を取得することになり、スーパークラスの実装を取得するには追加の作業を行う必要があります。では、サブクラスで __unicode__ を定義するだけでは十分ではないのはなぜですか --- 実際、問題は __unicode__ がまったく呼び出されないことかもしれません。だから多分アニマルに __unicode__ を定義してサブクラスを呼び出させると
わかりました、ORM の問題は理解できたと思います。これらの答えは両方とも、これを理解するのに役立ちました、ありがとう。これを試しているうちに、Django がサブクラス化されたモデルを保存するときに、(1) サブクラス化されたオブジェクトの行をスーパークラスのテーブルに作成し、(2) サブクラス テーブルの PK をスーパークラス テーブルで割り当てられた PK。サブクラス テーブル内のこの PK は、superclass_ptr という名前です。これに基づいて、私は以下を作成しました。フィードバックをいただければ幸いです。
Class Animal(models.Model)
def __unicode__(self):
if Dog.objects.filter(pk=self.pk).count() > 0:
return unicode(Dog.objects.get(pk=self.pk))
elif Cat.objects.filter(pk=self.pk).count() > 0:
return unicode(Cat.objects.get(pk=self.pk))
else:
return "An Animal!"
ローレンスは、この質問に関して最も適切であるようです。Cat と Dog はばらばらの PK セットを持ちます (そして、Animal のサブクラスはスーパークラスのレコードと同じ PK を持ちます) が、残念ながら Django は舞台裏で何も実行しません。動物には犬と猫のサブクラスがあります。具体的には、私は動物番号 3 で、さらに確認したところ、猫番号 3 もあります。つまり、私は実際には猫番号 3 です」. Python のイントロスペクションを使用すると、これは完全に可能であり、非常に合理的であるように見えますが (猫は動物自身ができないことは何もしないため)。皆さん、ありがとうございました。