gpt4 book ai didi

django - 在对基类进行查询后确定 Django 模型实例类型

转载 作者:行者123 更新时间:2023-12-04 01:20:32 25 4
gpt4 key购买 nike

在从对基类的查询返回之后,有没有办法确定 Django 数据库对象的“真实”类是什么?

例如,如果我有这些模型......

class Animal(models.Model):
name= models.CharField(max_length=128)

class Person(Animal):
pants_size = models.IntegerField(null=True)

class Dog(Animal):
panting_rate = models.IntegerField(null=True)

并创建这些实例...
Person(name='Dave').save()
Dog(name='Mr. Rufflesworth').save()

如果我做这样的查询 Animal.objects.all() ,我最终得到两个 Animal实例,不是 Person 的实例和一个 Dog 的实例.有没有办法确定哪个实例属于哪种类型?

仅供引用:我已经尝试过这样做......
isinstance(Animal.objects.get(name='Dave'),Person) # <-- Returns false!

但这似乎不起作用。

最佳答案

我过去也遇到过类似的问题,最终在 this answer 的帮助下找到了令人满意的解决方案.

通过实现一个抽象类来存储真正的类并让它由你的父类继承,一次可以将每个父类实例转换为实际类型。 (该答案中使用的抽象类现在在 django-model-utils 中可用。)

例如,一旦您定义了抽象类(或者如果您有 django-model-utils),您可以简单地执行以下操作:

class Animal(InheritanceCastModel):
name= models.CharField(max_length=128)

class Person(Animal):
pants_size = models.IntegerField(null=True)

class Dog(Animal):
panting_rate = models.IntegerField(null=True)

使用它很简单:
>>> from zoo.models import Animal, Person, Dog
>>> Animal(name='Malcolm').save()
>>> Person(name='Dave').save()
>>> Dog(name='Mr. Rufflesworth').save()
>>> for obj in Animal.objects.all():
... print obj.name, type(obj.cast())
...
Malcolm <class 'zoo.models.Animal'>
Dave <class 'zoo.models.Person'>
Mr. Rufflesworth <class 'zoo.models.Dog'>

关于django - 在对基类进行查询后确定 Django 模型实例类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5225556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com