2

Djangoには次のモデルがあります。Animal抽象基本クラスを作成しない理由があります。

class Animal(models.Model):
    sound = "none"
    def ClassType(self):
        return 'animal'

class Cat(Animal):
    animal_id = models.OneToOneField(Animal,parent_link=True)
    sound = "meow"
    def ClassType(self):
        return 'cat'

class Dog(Animal):
    animal_id = models.OneToOneField(Animal,parent_link=True)
    sound = "bow"
    def ClassType(self):
        return 'dog'

動物のセットを次のようにクエリします

query = Animal.objects.all()

結果は必然的に Dogs と Cats のみのリストになります。ただし、電話をかけると

query[0].ClassType

私は得るだけですanimal。「クエリ」内のすべてのオブジェクトは、インスタンスを取得したり依存したりanimalしたいときに私に与えてくれます。Python ポリモーフィックの世界で理解できないことと、それを修正するにはどうすればよいですか?dogcat

4

3 に答える 3

0

メソッドを作成する代わりに、ClassTypeそれを実際のフィールドにし、保存時にオブジェクトのタイプを保存する必要があります。そうしないと、発見したように、Animalsをクエリすると、サブタイプではなく、Animalsのみが取得されます。

于 2013-01-09T19:53:54.110 に答える
0

ドット表記 (属性のような) を使用して、犬と猫のオブジェクトにアクセスできます。クエリAnimal.objects.all()は、すべての猫と犬を含むすべての動物を返します。

qs = Animal.objects.all()
for animal in qs:
    try:
        obj = animal.cat
        # its a cat
    except AttrbuteError:
        # its a dog
        obj = animal.dog

ご覧のとおり、どれが犬でどれが猫かを識別するのに問題があるだけなので、動物モデルに一時的な属性を設定することをお勧めします。

class Animal(models.Model):
    sound = "none"

    def is_cat(self):
        if not hasattr(self, '_is_cat'):
            self._is_cat = Cat.objects.filter(animal_id=self).exists()
        return self._is_cat

これで、次のように簡単に実行できます。

qs = Animal.objects.all()
for animal in qs:
    if animal.is_cat():
        # this is a cat
    else:
        # dog
于 2013-01-09T19:11:24.113 に答える