https://docs.djangoproject.com/en/3.2/topics/db/models/#meta-options
기본을 모르니까 할때마다 막히는 것 같아서 다시 정리 한다.
언젠가 익숙해지겠지.
Models
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
Field option
이용가능한 필드 옵션 리스트
필드 옵션 | 설명 |
null (Field.null) | null = True 로 작성 시 database에 null 삽입 가능 default 는 False CharField 나 TextField 에서는 해당 옵션 사용을 권장하지 않음 (Null과 Empty String이 혼동할 수 있음) |
blank(Field.blank) | blank = True 일 경우 빈값 허용 default는 False 이며 False일 경우 필수 값이 됨 null과는 다름 |
choices (Field.choices) | 2개의 아이템을 가지는 시퀀스 입니다. (e.g. [(A, B), (A, B) ...]) model validation이 적용되며 default form 의 widget은 selectbox 가 제공 ex) YEAR_IN_SCHOOL_CHOICES = [ ('FR', 'Freshman'), ('SO', 'Sophomore'), ('JR', 'Junior'), ('SR', 'Senior'), ('GR', 'Graduate'), ] * 차후 필요시 재 정리 |
db_column(Field.db_column) | 컬럼명은 디폴트로 필드명을 사용 하지만, 다르게 사용하고 싶은 경우 지정 db_column = "컬럼명" |
db_index(Field.db_index) | db_index = True 인 경우 해당 필드에 대해서 database index 생성 |
db_tablespace (Field.db_tablespace) |
필드가 인덱싱 될 경우 사용하는 테이블스페이스의 이름 https://docs.djangoproject.com/en/3.2/topics/db/tablespaces/ ex) name = models.CharField(max_length=30, db_index=True, db_tablespace="indexes") |
default(Field.default) | 필드의 default 값 지정 변하기 쉬운 object값은 사용 불가(ex.Model instance, List, set 등) |
editable(Field.editable) | editable = False 일 경우 admin이나 ModelForm에 나오지 않음 default 값은 True |
error_messages (Field.error_messages) |
기본 메세지를 오버라이딩 함. dictonary 형태로 작성 하며 key 값은 null, blank, invalid, invalid_choice, unique 및 unique_for_date 사용 가능 (그외 : https://docs.djangoproject.com/en/3.2/ref/models/fields/#field-types ) |
help_text(Field.help_text) | form 위젯에 추가적인 help text 가 노출 help_text="Please use the following format: YYYY-MM-DD." |
primary_key (Field.primary_key) |
primary_key=True 일 경우 해당 필드가 primary_key 만약 primary_key를 표시하지 않을 경우 장고가 자동적으로 필드를 추가(이 경우 AutoFields) primary_key=True 는 null=False 이고 unique=True 이며 오직 하나만 설정 가능 |
unique(Field.unique) | unique = True 일 경우 해당 테이블내 삽입값이 고유해야 함 이 옵션은 ManyToManyField 와 OneToOneField 에서 모두 유효함 db_index를 설정할 필요없음 (unqiue가 index 생성을 암시함) |
unique_for_date (Field.unique_for_date) |
DateField 또는 DateTimeField 가 type으로 요구되며 해당 데이터 필드에서 고유함 * 차후 필요시 재 정리 https://docs.djangoproject.com/en/3.2/ref/models/fields/#unique-for-date |
unique_for_month (Field.unique_for_month) |
unique_for_date 와 비슷 단, 월과 관련해서 필드가 고유해야 함 |
unique_for_year (Field.unique_for_year) |
unique_for_date 나 unique_for_month와 같다 |
verbose_name (Field.verbose_name) |
사람이 읽을 수 있는 이름. 만약 이름이 주어지지 않으면 필드의 속성 이름으로 underscore(밑줄)은 공백으로 변경되어 자동 생성 됨 ex) first_name = models.CharField(max_length=30) >> "first name" https://docs.djangoproject.com/en/3.2/topics/db/models/#verbose-field-names |
validators(Field.validators) | 이 필드에 대해 수행하는 유효성 검사 list 상세내역 : https://docs.djangoproject.com/en/3.2/ref/validators/ 조회 및 가져오기 : 조회 등록 API 를 지원하며 API를 사용하여 조회 방법을 사용자가 지정 가능 https://docs.djangoproject.com/en/3.2/ref/models/lookups/#lookup-registration-api |
Field types
이용가능한 타입 리스트
필드 타입 | 설명 |
AutoField | class AutoField(**options) - IntegerField 에서 이용가능한 ID에 따라 자동으로 증가 됨 직접 사용할 필요가 없으며, - primary key에서는 자동으로 모델에 추가 됩니다. |
BigAutoField | class BigAutoField(**options) - 64-bit integer. - 1 에서 9223372036854775807 까지 생성된다는 점을 빼고는 AutoField 와 동일 |
BigIntegerField | class BigIntegerField(**options) - 64-bit integer. - -9223372036854775808 에서 9223372036854775807까지 생성된다는 점을 제외하고는 - IntegerField 와 동일 - default form 위젯은 NumberInput. - BinaryField.max_length 필드의 최대 길이(바이트) MaxLengthValidator를 사용하여 Django의 유효성 검사에서 최대 길이가 적용 |
BinaryField | class BinaryField(max_length=None, **options) - raw binary data 로 저장되는 필드 - bytes, bytearray, or memoryview로 assign 됨 - 기본적으로 BinaryField는 editable을 False로 설정하며, 이 경우 ModelForm에 포함되지 않음 - BinaryField 는 추가로 하나의 옵셔널 인수를 가짐 |
BooleanField | class BooleanField(**options) - true/false 필드 - 기본 Form 위젯은 CheckboxInput 또는 null=True 일경우는 NullBooleanSelect 기본 값은 Field. - default가 설정되지 않았을 경우 None |
CharField | class CharField(max_length=None, **options) - 작거나 큰 사이즈의 string 필드 많은 양의 텍스트를 담을 경우 TextField. - 기본 form 위젯은 TextInput. CharField 는 두개의 인수를 가짐
|
DateField | class DateField(auto_now=False, auto_now_add=False, **options) - 일자. Python으로 datetime.date DateField.auto_now - object가 저장될때 자동으로 현재 시간으로 저장 - 마지막으로 수정한 timestamp에 유용 - Model.save()가 호출 될때 자동적으로 저장됨 - QuerySet.update()와 같은 방법으로 다른 필드를 업데이트할 때 필드가 업데이트되지 않지만, 업데이트에서 필드에 대한 사용자 지정 값을 지정할 수 있습니다. DateField.auto_now_add - object가 처음 생성될때 자동으로 현재 시간으로 셋팅 - 타임스탬프 작성에 유용 - Note! 현재 일자가 항상 사용되며 재정의 할 수 있는 default값이 아님 때문에 object를 생성 시 이 필드에 값을 설정해도 무시됨 만약 이 필드에 겂을 수정하길 원한다면 auto_now_add=True: 대신 밑의 설정을 셋팅
- admin 은 JavaScript calendar 와 "Today" 를 위한 바로가기 를 추가 - invalid_date 오류 메세지 키를 추가로 포함 - auto_now_add, auto_now, default 옵션은 함께 사용 불가 함께 사용시 오류 발생 -Note! auto_now 또는 auto_now_add 를 True 로 셋팅하면 필드가 editable=False 와 blank=True 로 설정 됩니다. |
DateTimeField | class DateTimeField(auto_now=False, auto_now_add=False, **options) - date 와 time (python 의 datetime.datetime) - DateField 동일 인수값 사용 - 기본 form 위젯은 단일 DateTimeInput - admin은 JavaScript 단축키가 있는 두 개의 개별 TextInput 위젯을 사용 |
DecimalField | class DecimalField(max_digits=None, decimal_places=None, **options) - 입력값은 DecimalValidator 를 사용하여 검증 DecimalField.max_digits - 숫자에 허용되는 최대 자릿수. 이 숫자는 decimal_places보다 크거나 같아야 함 DecimalField.decimal_places - 숫자와 함께 저장할 소수 자리수 Ex) 분해능(서로 떨어져 있는 두 물체를 서로 구별할 수 있는 능력을)이 소수점 2자리인 999까지 숫자를 저장하려면 다음을 사용 models.DecimalField(..., max_digits=5, decimal_places=2) Ex) 10자리 분해능으로 약 10억까지 숫자를 저장할때 models.DecimalField(..., max_digits=19, decimal_places=10) - 기본 form 위젯 필드는 NumberInput - localize가 False이면 입력, 그렇지 않으면 TextInput |
DurationField | class DurationField(**options) - 기간을 저장하는 필드 (python 에서 timedelta) - PostgreSQL사용시 데이터 타입은 interval - Oracle 사용시 데이터 유형 INTERVE DAY(9) ~ Second(6) 그렇지 않으면 bigint (microseconds) 가 사용 |
EmailField | class EmailField(max_length=254, **options) - EmailValidator 을 사용하여 값이 유효한 전자메일 주소인지 확인하는 CharField |
FileField / FilePathField / ImageField |
class FileField(upload_to=None, max_length=100, **options) class FilePathField(path='', match=None, recursive=False, allow_files=True, allow_folders=False, max_length=100, **options) class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options) * 차후 재정의 |
FloatField | class FloatField(**options) - floating-point 수 (python 에서 float) - 기본 form 위젯은 NumberInput - localize가 False이면 입력, 그렇지 않으면 TextInput - FloatField vs. DecimalField 둘다 실수이나 표현이 다름 FloatField - Python’s float DecimalField - Python’s Decimal |
IntegerField | class IntegerField(**options) - integer - -2147483648 에서 2147483647 까지 - MinValueValidator 와 MaxValueValidator 을 사용하여 database가 지원하는 input 유효성 검사 - 기본 form 은 NumberInput - localize가 False이면 입력, 그렇지 않으면 TextInput |
GenericIPAddressField | class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options) - string 형식의 IPv4 또는 IPv6 주소(예: 192.0.2.30 또는 2a02:42fe::4) - 기본 form 위젯은 TextInput GenericIPAddressField.protocol - 유효한 입력값을 지정된 프로토콜로 제한 - 허용되는 값 'both' (default), 'IPv4' or 'IPv6'. - 대소문자 구분하지 않음 GenericIPAddressField.unpack_ipv4 - IPv4 매핑 주소(예::ffff:192.0.2.1)에 압축을 품 (Unpacks) - 해당 옵션 사용 시 해당 주소가 192.0.2.1로 압축 해제(unpacked) - 기본값은 비활성화 이며 프로토콜이 'both' 설정시 사용 가능 - blank 허용시 blank 값이 null로 저장되므로 null값 허용 필요 |
JSONField | class JSONField(encoder=None, decoder=None, **options) - JSON encoded data 로 저장되는 필드 - python 에서 ( Python native format: dictionaries, lists, strings, numbers, booleans, None) - JSONField 는 MariaDB 10.2.7+, MySQL 5.7.8+, Oracle, PostgreSQL, and SQLite 지원 (JSON1 확장자가 활성화된 경우) JSONField.encoder - 표준 JSON serializer에서 지원하지 않는 데이터 유형을 serializer 하는 옵셔널(optional) json.JSONEncoder 하위 클래스(예: datetime.datetime 또는 UUID) 예를 들면 DjangoJSONEncoder class 를 사용할 수 있음 - 기본 json.JSONEncoder. JSONField.decoder - database에서 검색된 값을 deserialize 하기 위한 선택적(optional) json.JSONDecoder 하위클래스 - value는 custom encoder 에서 선택한 형식(대개 문자열) - 역직렬화는 입력유형을 확신할 수 없다는 사실을 고려해야 함 예를 들어, 실제로는 datetime 형식의 포맷을 취한 String을 datetime으로 반환할 위험 존재 - 기본 json.JSONDecoder. https://docs.djangoproject.com/en/3.2/ref/models/fields/#jsonfield |
PositiveBigIntegerField | class PositiveBigIntegerField(**options) - PositiveIntegerField 와 유사 - 0에서 9223372036854775807 사이를 사용 하며, Django에서 지원하는 모든 database에서 안전하게 사용 가능 |
PositiveIntegerField | class PositiveIntegerField(**options) - IntegerField와 유사 - 0에서 2147483647 사이의 값을 사용하며, Django에서 지원하는 모든 database에서 안전하게 사용 가능 - 이전버전과의 호환성을 위해 0값 허용 |
PositiveSmallIntegerField | class PositiveSmallIntegerField(**options) - PositiveIntegerField와 유사. 하지만 database에 종속되어 특정 지점 아래까지만 허용 - 0에서 32767 사용. Django에서 지원하는 모든 database에서 안전하게 사용 가능 |
SlugField | class SlugField(max_length=50, **options) - Slug 는 신문의 용어로 문자, 숫자, _(underscores), -(hyphens) 을 포함하는 짧은 label - 일반적으로 URL 에 사용 됨 - CharField와 같이 특별한 max_length 지정 가능 max_length 를 지정하지 않으면 django의 기본길이인 50 으로 사용 - Field.db_index = True로 셋팅하는 것을 의미 - 종종 SlugField를 다른 값을 기준으로 하여 미리 채우는 것이 유용할 수 있음 관리자가 prepuplated_fields를 사용하여 자동으로 해당 작업을 수행할 수 있음 https://docs.djangoproject.com/en/3.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.prepopulated_fields - 검증에 validate_slug 또는 validate_unicode_slug 사용 SlugField.allow_unicode - default 값은 False - True이면 필드에는 ASCII 문자 외에 유니코드 문자 사용 |
SmallAutoField | class SmallAutoField(**options) - AutoField와 유사 하지만 database에 종속되어 특정 지점 아래까지만 허용 - 0에서 32767 사용. Django에서 지원하는 모든 database에서 안전하게 사용 가능 |
SmallIntegerField | class SmallIntegerField(**options) - IntegerField와 유사 - -32768에서 32767까지 값은 Django에서 지원하는 모든 database에서 안전하게 사용 가능 |
TextField | class TextField(**options) - large text field - 기본 form 위젯은 Textarea 필드 - max_length 속성을 지정하면 자동 생성된 from 필드의 Textarea 위젯에 반영됨 (model 이나 database 영역에서는 적용되지 않음 - CharField 사용 TextField.db_collation - 필드의 database collation 이름 - Oracle : 오라클은 TextField에 대한 데이터정렬을 지원하지않음 |
TimeField | class TimeField(auto_now=False, auto_now_add=False, **options) - 시간 필드. python에서 datetime.time - DateField와 동일한 자동입력 옵션 허용 - 기본 form 위젯은 TimeInput - 관리자가 JavaScript 로 바로가기(shortcuts) 추가 |
URLField | class URLField(max_length=200, **options) - URL을 위한 CharField - URLValidator 로 유효성 체크 - 기본 form 위젯 URLInput. - 모든 CharField 의 하위 클레스와 마찬가지로 URLField는 선택적 max_length 인수 사용 max_length 미지정시 200 사용 |
UUIDField | class UUIDField(**options) - 범용 고유 식별자를 저장하는 필드 (python의 UUID class 사용) - PostgreSQL 사용시 uuid 데이터 유형에 저장 그렇지 않을 경우 (CHAR(32))에 저장 - primary_key 의 AutoField 의 좋은 대체제로 DATABASE에서 UUID 를 사용하지 않으니 기본값 사용 권장 |
일단은 필드 정리만!
'Python > Django' 카테고리의 다른 글
Django ORM과 QuerySet (0) | 2022.10.22 |
---|---|
Django - Bulk_create 로 대량의 데이터 DB에 insert하기 (0) | 2022.10.12 |
Django Form 작성 방법 (0) | 2022.10.03 |
우분투 내 MariaDB 설치 (0) | 2022.09.28 |
MariaDB 설치 시 오류 해결 방법 (ERROR 2002 (HY000)) (0) | 2022.09.27 |