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
'developer tip' 카테고리의 다른 글
객체가 자바 스크립트 딥 카피 또는 얕은 카피의 배열로 푸시됩니까? (0) | 2020.11.10 |
---|---|
ThreadPoolExecutor의 코어 풀 크기 대 최대 풀 크기 (0) | 2020.11.10 |
git commit 주석을 래핑하는 방법은 무엇입니까? (0) | 2020.11.10 |
PHP 변수 제거, 공백을 대시로 대체 (0) | 2020.11.09 |
자바에서 완성 된 미래를 만드는 방법 (0) | 2020.11.09 |