Объект не имеет атрибута _state - PullRequest
18 голосов
/ 13 марта 2011

Я разрабатываю приложение 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 ]

21 голосов
/ 13 марта 2011

во-первых, вы должны быть очень осторожны, переопределяя __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», которое будет внешним ключом для модели Animal.

6 голосов
/ 21 мая 2015

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

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

  1. Добавить метод класса в класс модели
  2. Добавить метод в пользовательский менеджер (обычно предпочтительнее)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...