2011-05-02 38 views
4

我用我的Django的模型子这样子类: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: 
     ... 

但是这给了我一个DoesNotExist错误时,该人是 驱动程序。有没有办法向Person类询问它的子类?

在此先感谢 雅克

+0

,我不认为这是一个直接的方式。你可以做的是将人员类型存储在人员模型中,并在你的视图中使用该字段来适当地提取信息。 – Konstant 2011-05-02 10:21:59

回答

3

你不能做到这一点。 Person模型查询不同的表 - appname_person,Butcher,另一个和Driver另一个。

在Django模型中的继承只会节省您再次写入字段并且不会查询多个表 - 它不应该。

取得成就这种效果,你应该在DB有Person.type,或者你应该使用Generic Relations,您在其中进行Person有所有你要创建的亚型通用的关系(实际上不继承,并定义泛型)

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

12

您的基本逻辑是健全的;问题在于你如何测试。你必须检查属性的存在,而不是它的价值。例如:

def person_detail_view(request, slug): 
    person = Person.objects.get(slug=slug) 

    if hasattr(person, 'butcher'): 
     ... 

    elif hasattr(person, 'driver'): 
     ... 
+0

这只是完美的作品!非常感谢。 – jacques 2011-05-03 15:35:36