developer tip

django 모델에서 사용할 __init__ 함수 작성

copycodes 2020. 11. 10. 08:18
반응형

django 모델에서 사용할 __init__ 함수 작성


다음 __init__을 수행하여 객체를 만들 수 있도록 모델 중 하나에 대한 함수 를 작성하려고합니다 .

p = User('name','email')

모델을 작성할 때 다음이 있습니다.

def __init__(self, name, email, house_id, password):
    models.Model.__init__(self)
    self.name = name
    self.email = email

이것은 작동하고 객체를 데이터베이스에 저장할 수 있지만을 User.objects.all()수행하면 내 __init__기능 을 제거하지 않는 한 아무것도 가져 오지 않습니다 . 어떤 아이디어?


Django의 내장 기능에 의존하고 명명 된 매개 변수를 전달하는 것이 가장 간단한 방법입니다.

p = User(name="Fred", email="fred@example.com")

그러나 일부 키 입력을 저장하도록 설정했다면 이니셜 라이저를 엉망으로 만드는 대신 정적 편의 메서드를 클래스에 추가하는 것이 좋습니다.

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

# Use it
p = User.create("Fred", "fred@example.com")

Django는 모델 생성자의 서명이 (self, *args, **kwargs)이거나 합리적인 팩스 일 것으로 예상합니다 . 서명을 완전히 호환되지 않는 것으로 변경하면 손상되었습니다.


정답은 Django 문서에__init__ 설명 된대로 클래스 메서드를 재정의하지 않고 작성하는 것 입니다.

그러나 이것은 시도하는 것처럼 수행 될 수 있습니다.에서 *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', 'me@bertreynolds.com','0123456789','5432106789',....)

여기서 또 다른 문제는 'Bert'가 이름인지 성인 지 모르는 것입니다. 마지막 두 번호는 쉽게 전화 번호와 시스템 ID가 될 수 있습니다. 그러나 명시 적이 지 않으면 쉽게 섞거나 식별자를 사용하는 경우 순서를 섞을 것입니다. 게다가 순서 기반으로하는 것은이 방법을 사용하는 다른 개발자들에게 또 다른 제약을 가하고 매개 변수의 임의 순서를 기억하지 못할 것입니다.

대신 다음과 같은 것을 선호해야합니다.

User(
    first_name='Bert',
    last_name='Reynolds',
    email='me@bertreynolds.com',
    phone='0123456789',
    system_id='5432106789',
)

이것이 테스트 또는 그와 비슷한 것이라면 팩토리를 사용하여 모델을 빠르게 만들 수 있습니다. 팩토리 보이 링크가 유용 할 수 있습니다 : http://factoryboy.readthedocs.org/en/latest/

참고 URL : https://stackoverflow.com/questions/843580/writing-a-init-function-to-be-used-in-django-model

반응형