2011-05-02 40 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