Написание функции инициализации для использования в модели django



Я пытаюсь написать

548   4  

4 ответов:

полагаться на встроенную функциональность Django и передавать именованные параметры было бы самым простым способом.

p = User(name="Fred", email="[email protected]")

но если вы настроены на сохранение некоторых нажатий клавиш, я бы предложил добавить статический метод удобства в класс вместо того, чтобы возиться с инициализатором.

# In User class declaration
@classmethod
def create(cls, name, email):
  return cls(name=name, email=email)

# Use it
p = User.create("Fred", "[email protected]")

Django ожидает, что подпись конструктора модели будет (self, *args, **kwargs), или какое-то разумное факсимиле. Ваше изменение подписи на что-то совершенно несовместимое сломало ее.

правильный ответ, чтобы избежать переопределения __init__ и написать classmethod, как описано в Django docs.

но это может быть сделано, как вы пытаетесь, вы просто нужно добавить в *args, **kwargs быть принятым вашим __init__, и передать их на вызов супер метода.

def __init__(self, name, email, house_id, password, *args, **kwargs):
        super(models.Model, self).__init__(self, *args, **kwargs)
        self.name = name
        self.email = email

не создавайте модели с параметрами args. Если вы делаете такую модель:

 User('name','email')

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

User('Bert', 'Reynolds', '[email protected]','0123456789','5432106789',....)

другая проблема здесь заключается в том, что вы не знаете, является ли 'Берт' - первый или фамилию. Последние два номера могут легко быть телефонным номером и системным идентификатором. Но без его явного вы будете более легко смешивать их, или смешать заказ, если вы используете идентификаторы. Более того, выполнение этого порядка на основе поставит еще одно ограничение на других разработчиков, которые используют этот метод и не будут помнить произвольный порядок параметров.

вы должны предпочитают что-то вроде этого:

User(
    first_name='Bert',
    last_name='Reynolds',
    email='[email protected]',
    phone='0123456789',
    system_id='5432106789',
)

Если это для тестов или что-то в этом роде, вы можете использовать завод для быстрого создания моделей. Ссылка заводской мальчик может быть полезна: http://factoryboy.readthedocs.org/en/latest/

Comments

    Ничего не найдено.