对象没有_state属性

时间:2011-03-13 14:29:15

标签: python django

我正在开发Django应用程序,我有以下错误

'Sheep' object has no attribute _state

我的模型是这样构建的

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)

我必须做什么?

2 个答案:

答案 0 :(得分: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()

如果你只使用这个对象的子类,我强烈建议在Animal上设置抽象选项。这确保不为动物创建表格,仅为绵羊(等等)创建表格。如果未设置abstract,则将创建一个Animal表,并且Sheep类将被赋予它自己的表和一个自动“动物”字段,该字段将成为Animal模型的外键。

答案 1 :(得分:6)

http://en.cppreference.com/w/cpp/memory/shared_ptr建议您在模型中使用__init__方法:

  

您可能想要通过覆盖__init__方法来自定义模型。但是,如果这样做,请注意不要更改调用签名,因为任何更改都可能阻止保存模型实例。不要覆盖var ref = Firebase(url:MY_FIREBASE_URL) ref.childByAppendingPath("some-child").observeSingleEventOfType( FEventType.Value, withBlock: { (snapshot) -> Void in for child in snapshot.children { let childSnapshot = snapshot.childSnapshotForPath(child.key) let someValue = childSnapshot.value["key"] as! String } }) ,而是尝试使用以下方法之一:

     
      
  1. 在模型类
  2. 上添加classmethod   
  3. 在自定义管理器上添加方法(通常首选)
  4.