我在 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()
结果是一个必须只有狗和猫的列表。但是,在调用
查询[0].ClassType
我只得到动物。 “查询”中的所有对象都给我 animal,而我想根据实例获取 dog 或 cat。我在 Python 多态世界中有什么不理解的,我该如何解决?
请您参考如下方法:
您可以使用点符号(如属性)访问狗和猫对象。查询 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
