2011-03-01 75 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