我在我的django模型中使用了这样的子类:
class Person(models.Model):
name = models.CharField(max_length=100)
...
class Butcher(Person):
...
class Driver(Person):
...
在我看来,我想根据子类做某些事情 人类的,像这样:
def person_detail_view(request, slug):
person = Person.objects.get(slug=slug)
if person.butcher:
...
elif person.driver:
...
但是当Person是a时,这会给我一个DoesNotExist-Error 驱动程序。有没有办法向Person类询问其子类?
提前致谢 雅克
答案 0 :(得分:12)
你的基本逻辑是合理的;问题在于你的测试方式。您必须检查属性的存在,而不是它的值。例如:
def person_detail_view(request, slug):
person = Person.objects.get(slug=slug)
if hasattr(person, 'butcher'):
...
elif hasattr(person, 'driver'):
...
答案 1 :(得分:3)
你做不到。 Person
模型会查询另一个表格 - appname_person
,Butcher
,另一个表格和Driver
另一个表格。
Django模型中的继承只能为您保存字段的写入,并且不会查询多个表 - 它也不应该。
要达到这种效果,你应该在数据库中有一个Person.type
,或者你应该使用Generic Relations,你可以使Person
与你的所有子类型具有通用关系打算创建(没有实际继承和定义通用外键。)
如果每个模型中的字段相同,只需向该人添加type
字段即可;或者如果字段完全不同,请遵循通用关系方法。
答案 2 :(得分:1)
django-polymorphic模块确实非常重要,而且使用起来非常简单。