Ошибка: нет атрибута ‘_state’

#python #django #django-models

#python #django #django-модели

Вопрос:

У меня есть модель:

 class User(models.Model):

    user_id = models.IntegerField(default=0)
    user_name = models.CharField(max_length=20)
    user_age = models.IntegerField(default=0)

    def __init__(self, user_id, user_name, user_age):
        self.user_id = user_id
        self.user_name = user_name
        self.user_age = user_age
  

И затем я пытаюсь создать экземпляр этой модели:

 new_user = User(0, 'Andrew', 25)
new_user.save()
  

Но это выдает мне ошибку:

 'User' object has no attribute '_state'
  

Что это значит?

Комментарии:

1. Вероятно, вам следует использовать auth фреймворк Django, в котором есть User модель и несколько абстрактных базовых классов, которые вы можете использовать. Это реализует множество функций, среди прочих криптографически безопасный метод для сохранения паролей и представлений входа / выхода из системы / сброса пароля по умолчанию и т.д. Взгляните в документацию .

Ответ №1:

В коде отсутствует вызов суперкласса’ __init__ :

 def __init__(self, user_id, user_name, user_age):
    super(User, self).__init__() # <----
    self.user_id = user_id
    self.user_name = user_name
    self.user_age = user_age
  

Ответ №2:

На самом деле вам вообще не следует определять __init__ метод. falsetru показывает, что вам нужно вызвать метод суперкласса, но все функциональные возможности, которые вы добавили в свою собственную версию, уже предоставлены этим.

Комментарии:

1. Спасибо. Но предположим, что я хочу иметь некоторые значения по умолчанию для полей, как я могу это сделать, не определяя init? Кроме того, если я просто использую инициализацию по умолчанию, то мне придется явно передавать переменные с их именами, например, new_user = User (user_id = 0, user_name = ‘Andrew’, user_age = 15), тогда как я хотел бы иметь возможность просто отправлять эти значения следующим образом: new_user = User (0, ‘Andrew’, 15).

2. Вы уже определили значения по умолчанию в самих объявлениях полей.