2011-03-01 86 views
1

好吧,我一直在閱讀其他django繼承問題,我找不到任何幫助。我可能對繼承的工作原理有一個瞭解。但這是我的問題。首先,我有兩個基本模型,我希望所有其他模型都可以繼承。基礎模型只包含一些適用於我所有模型的有用方法。第二個是帳戶特定對象的開始。Django繼承問題

class BaseModel(models.Model): 

# A couple of methods that all my models need to have. No fields. 

class AccountModel(models.Model): 
    ''' A base model for items related to a specific account''' 

    account = models.ForeignKey(Account) 

    def save(self, request, *args, **kwargs): 
     self.account = request.session['account'] 
     super(AccountModel, self).save(*args, **kwargs) 

然後,我有三個型號:

class Keyword(AccountModel) : 
    keyword = models.CharField(max_length=300) 
    #other fields, none required... 

class Project(AccountModel) : 
    project_name = models.CharField(max_length=200,verbose_name="Project Name") 
    #other fields.. 

class KeywordTarget(BaseModel): 
    keyword = models.ForeignKey(Keyword) 
    url = models.URLField(null=True,blank=True) 
    project = models.ForeignKey(Project) 

但是當我嘗試創建一個新的關鍵詞,我得到這個錯誤:

ValueError: Cannot assign "'something'": "Keyword.keyword" must be a "Keyword" instance. 

當我這樣做:

kw = Keyword(keyword = "something") 

我哪裏錯了?

(另外,請不要告訴我,我應該通過使用多對多,除非它解決了眼前的問題),它看起來既像BaseModel和帳戶模式將抽象

+0

你可能是做錯了,從它看起來像這樣的錯誤:Keyword.keyword是一個外鍵而不是你粘貼的代碼中定義的CharField。 – 2011-03-01 23:54:20

+0

是的......我可能做錯了什麼。它看起來像那樣,但我發佈的代碼就是那裏的內容。這就是爲什麼我認爲這是繼承的原因。 – lovefaithswing 2011-03-02 00:00:20

回答

2

,所以你應當規定,模特們的元對象,如:

class BaseModel(models.Model): 
    ... 

    class Meta: 
     abstract=True 

(見http://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes

我猜測,如果沒有,你就用繼承模型之間的干擾結束了。

+0

這工作得很好! – lovefaithswing 2011-03-02 00:12:18

+0

@Michael - 當BaseModel是你自定義的django UserProfile的任何建議? (這是在1.4上運行的,因此不考慮1.5中的Userprofile更改。)使用abstract = True,我找不到AUTH_PROFILE_MODULE的問題。 – Chris 2013-01-02 01:10:21

+0

@Chris - 你的意思是指定一個抽象模型作爲AUTH_USER_PROFILE?我懷疑這是不可能的 - 如果你使用多表繼承,你可能會做到這一點,但懷疑在處理AUTH時最好不要使事情複雜化。核心Django應用程序對繼承的支持有點弱。 – 2013-01-13 18:18:47