Объект не имеет атрибута _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)

Что я должен делать?

Ответы

Ответ 1

во-первых, вы должны быть очень осторожны, переопределяя __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, если вы будете использовать только подклассы этого объекта. Это гарантирует, что таблица не создана для животных и только для овец (и т.д.). если абстрактное не задано, тогда будет создана таблица Animal, а классу Sheep будет предоставлена ​​его собственная таблица и автоматическое поле "animal", которое будет внешним ключом к модели Animal.

Ответ 2

Django docs рекомендую вам использовать метод __init__ в моделях:

У вас может возникнуть соблазн настроить модель, переопределив метод __init__. Однако, если вы это сделаете, старайтесь не изменять сигнатуру вызова, поскольку любое изменение может помешать экземпляру модели быть сохраненным. Вместо того, чтобы переопределять __init__, попробуйте использовать один из этих подходов:

  • Добавьте класс класса в класс модели
  • Добавить метод в настраиваемый менеджер (обычно предпочитаемый)