我正在开发Django应用程序,我有以下错误
'Sheep' object has no attribute _state
Run Code Online (Sandbox Code Playgroud)
我的模型是这样构造的
class Animal(models.Model):
aul = models.ForeignKey(Aul)
weight = models.IntegerField()
quality = models.IntegerField()
age = models.IntegerField()
def __init__(self,aul):
self.aul=aul
self.weight=3
self.quality=10
self.age=0
def __str__(self):
return self.age
class Sheep(Animal):
wool = models.IntegerField()
def __init__(self,aul):
Animal.__init__(self,aul)
Run Code Online (Sandbox Code Playgroud)
我应该做什么?
Tho*_*mas 21
首先,您必须非常小心地覆盖__init__
具有非可选参数.记住每次从查询集中获取对象时都会调用它!
这是您想要的正确代码:
class Animal(models.Model):
#class Meta: #uncomment this for an abstract class
# abstract = True
aul = models.ForeignKey(Aul)
weight = models.IntegerField(default=3)
quality = models.IntegerField(default=10)
age = models.IntegerField(default=0)
def __unicode__(self):
return self.age
class Sheep(Animal):
wool = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
如果你只使用这个对象的子类,我强烈建议在Animal上设置抽象选项.这确保不为动物创建表格,仅为绵羊(等等)创建表格.如果未设置abstract,则将创建一个Animal表,并且Sheep类将被赋予它自己的表和一个自动"动物"字段,该字段将成为Animal模型的外键.
Django docs建议你不要__init__
在模型中使用方法:
您可能想通过覆盖
__init__
方法来自定义模型.但是,如果这样做,请注意不要更改调用签名,因为任何更改都可能阻止保存模型实例.而不是覆盖__init__
,尝试使用以下方法之一:
- 在模型类上添加classmethod
- 在自定义管理器上添加方法(通常是首选)
归档时间: |
|
查看次数: |
14279 次 |
最近记录: |