2011-03-13 11 views
15

_state何の属性を持っていない、と私はオブジェクトは、私が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) 

ように構成されているエラー以下がありますか?

答えて

19

まず、__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() 

。これにより、動物用のテーブルは作成されず、Sheep(など)用のテーブルのみが作成されます。要約が設定されていない場合は、Animalテーブルが作成され、Sheepクラスには独自のテーブルとAnimalモデルの外部キーとなる自動 'animal'フィールドが与えられます。

4

Django docsはモデルで__init__方法を使用することをあなたに対してお勧めします:

あなたは__init__メソッドをオーバーライドすることで、モデルをカスタマイズしたくなるかもしれません。ただし、変更するとモデルインスタンスが保存されない可能性があるため、呼び出し署名を変更しないように注意してください。むしろ__init__をオーバーライドよりも、これらのアプローチのいずれかを使用してみてください:

  1. モデルクラス
  2. 上のクラスメソッドを追加するカスタムマネージャー(通常は望ましい)
のメソッドを追加します。
関連する問題