2012-03-28 69 views
3

我很難理解爲什麼某些特性存在於某些模型中,所以我希望有人能在這裏解釋它們。瞭解Django模型繼承怪癖

這裏有一個基本的例子:

class Alpha(models.Model): 
    one = models.PositiveIntegerField() 


class Bravo(Alpha): 
    two = models.PositiveIntegerField() 


class Charlie(Alpha): 
    three = models.PositiveIntegerField() 


"bravo" in dir(Charlie()) 
True 

它是如何的Charlie一個實例具有bravo財產?是否有一個原因?我錯過了什麼?

更重要的是,爲什麼這會阻止我將bravo屬性添加到Charlie類中?

... 
class Charlie(Alpha): 
    three = models.PositiveIntegerField() 
    bravo = models.TextField() 


Charlie() 
ValueError: Cannot assign "''": "Charlie.bravo" must be a "Bravo" instance. 
+0

我*真的*必須輪到完成我的博客文章,爲什麼你不應該使用模型繼承。 – 2012-03-28 09:14:44

+1

當你這樣做,在這裏發佈你會嗎?我想閱讀它。 – 2012-03-28 10:33:25

回答

3

據我所知,這是父類有一個隱含的外鍵,它的所有後代,後者又繼承了孩子的事實的結果。事實上這可能不應該發生,但可能沒有任何防止它的方法。

一種可能性可能是在布拉沃explicitly set the parent link,所以它的related_name是'布拉沃'以外的東西,所以你可以在查理重用這個名字。

class Bravo(Alpha): 
    two = models.PositiveIntegerField() 
    alpha = models.OneToOneField(Alpha, parent_link=True, related_name='not_bravo')