django访问模型的子类

时间:2011-05-02 09:10:20

标签: django models subclass

我在我的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类询问其子类?

提前致谢 雅克

3 个答案:

答案 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_personButcher,另一个表格和Driver另一个表格。

Django模型中的继承只能为您保存字段的写入,并且不会查询多个表 - 它也不应该。

要达到这种效果,你应该在数据库中有一个Person.type,或者你应该使用Generic Relations,你可以使Person与你的所有子类型具有通用关系打算创建(没有实际继承和定义通用外键。)

如果每个模型中的字段相同,只需向该人添加type字段即可;或者如果字段完全不同,请遵循通用关系方法。

答案 2 :(得分:1)

django-polymorphic模块确实非常重要,而且使用起来非常简单。