brunch

매거진 Django doc

You can make anything
by writing

C.S.Lewis

by 장영석 Aug 21. 2018

Django Model - Field API

Field API reference

Field API reference

Field는 데이터베이스 테이블의 칼럼을 나타내는 추상 클래스다. Django는 데이터베이스 테이블을(db_type()), 생성하기 위해 필드를 사용해서 Python 타입을 데이터베이스에 매핑(get_prep_value())하고 그 반대(from_db_value())로 매핑한다.


따라서 field는 다른 Django API, 특히 model과 queryset에서 기본적인 부분이다.


model에서 field는 클래스 속성으로 인스턴스화 되고 특정 테이블 칼럼을 나타낸다. field는 null과 unique 같은 속성이 있고, Django가 field 값을 데이터베이스의 특정 값과 매핑하기 위해 사용하는 함수가 있다.


Field는 RegisterLookupMixin의 서브클래스고 따라서 QuerySet에서 사용되기 위해 Transform과 Lookup으로 등록될 수 있다. (e.g. field_name__exact="foo"). 모든 빌트인 lookup은 기본적으로 등록된다.


CharField와 같은 장고의 모든 빌트인 field는 Field의 특정 부분을 구현한 것이다. 커스텀 필드가 필요하다면, 빌트인 필드의 서브클래스로 만들거나 Field를 처음부터 작성할 수 있다.


description

필드에 대한 자세한 설명.

description의 형식은 다음과 같다.

인수는 필드의 __dict__의 정보로부터 보간 된다.


Field를 데이터베이스 유형으로 매핑하기 위해, Django는 몇 가지 메서드를 만들었다.


get_internal_type()

백엔드에서 특유의 목적으로 이 필드의 이름을 문자열로 반환한다. 기본적으로, 클래스 이름을 반환한다.


db_type(connection)

connection을 참조하여 필드를 위한 데이터베이스 칼럼 데이터 유형을 반환한다.


rel_db_type(connection)

connection을 참조하여 Field를 가리키는 ForeignKey와 OneToOneField 같은 필드를 위한 데이터베이스 칼럼 데이터 유형을 반환한다.


Django가 데이터베이스 백엔드와 필드와의 상호작용을 위해 필요한 세 가지 주요 상황이 있다.

데이터베이스를 쿼리 할 때 (Python 값 -> 데이터베이스 백엔드 값)

데이터베이스로부터 데이터를 로드할 때 (데이터베이스 백엔드 값 -> Python 값)

데이터베이스에 저장할 때 (Python 값 -> 데이터베이스 백엔드 값)


쿼리 할 때, get_db_prep_value()와 get_prep_value()가 사용된다.


get_prep_value(value)

value는 모델의 속성의 현재 값이고 메서드는 쿼리의 파라미터로 사용되기 위해 prepared 형식의 데이터를 반환해야 한다.


get_db_prep_value(value, connection, prepared=False)

value를 백엔드에 관련된 값으로 변환한다. 기본적으로 prepared=True면 value를 반환하고 False면 get_prep_value()를 반환한다.


데이터를 로딩할 때, from_db_value()가 사용된다.


from_db_value(value, expression, connection)

데이터베이스에서 반환된 값을 Python 객체로 변환한다. get_prep_value()와 반대의 역할을 한다.


이 메서드는 데이터베이스 백엔드가 이미 정확한 Python 유형을 반환하거나 백엔드에서 변환하기 때문에 대부분의 내장 필드에서는 사용되지 않는다.


사용법은 Converting values to Python objects를 봐라.


Note

성능상의 이유로, from_db_value는 그것이 필요하지 않은 필드(모든 Django 필드)에 no-op로 구현되지 않았다. 따라서 정의할 때 super를 호출할 수 없다.


저장 시에, pre_save() get_db_prep_save()에서 사용된다.


get_db_prep_save(value, connection)

get_db_prep_value()와 비슷하지만, 필드 값이 데이터베이스에 저장되어야 할 때 호출된다. 기본적으로 get_db_prep_value()를 반환한다.


pre_save(model_instance , add)

메서드는 저장되기 전에 값을 준비하기 위해 get_db_prep_save() 이전에 호출된다.(예: DateField.auto_now).


model_instance는 이 필드가 속한 인스턴스이고 add는 인스턴스가 처음으로 데이터베이스에 저장되는지 여부다.


이 필드의 model_instance에 적절한 속성에 값을 할당해야 한다. 속성 이름은 self.attname에 있다(이는 Field에 의해 설정된다).


사용하는 방법은 Preprocessing values before saving를 봐라.


필드는 종종 serialization이나 form으로부터 다른 형태의 값을 받는다.


to_python(value)

value를 올바른 Python 객체로 변환한다. value_to_string()의 반대 동작이고 clean()에서도 호출된다.


자세한 사용법은 Converting values to Python objects를 봐라.


데이터베이스에 저장되는 것 이외에도, 필드는 값을 직렬화하는 방법을 알 필요가 있다.


value_from_object(obj)

모델 인스턴스의 해당 필드의 값을 반환한다.

이 메서드는 value_to_string()에서 자주 사용된다.


value_to_string(obj)

obj를 문자열로 변환한다. 필드의 값을 직렬화하기 위해 사용된다.

자세한 사용법은 Converting field data for serialization을 봐라.


model form을 사용할 때, Field는 어떤 form 필드를 나타내야 하는지 알아야 한다.


formfield(form_calss=None, choices_form_class=None, **kwargs)

ModelForm필드의 기본 django.forms.Field를 반환한다.


기본적으로, form_classchoices_form_classNone이라면, CharField를 사용한다. 필드에 choices가 있고 choices_form_class가 지정되지 않았다면, TypedChoiceField가 사용된다.


자세한 사용법은 Specifying the form field for a model field를 봐라.


deconstruct()

필드를 재생성하기에 충분한 정보를 4-tuple로 반환한다.

모델에서 필드의 이름.

필드의 import 경로 (예. "django.db.models.IntegerField"). 이는 가장 portable 한 버전이어야 하므로 덜 구체적일 수 있다.

위치 인수의 목록.

키워드 인수의 사전.

Migrations를 사용하여 데이터를 migrate 하기 위해서는 이 메서드를 1.7 이전의 필드에 추가되어야 한다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari