본문 바로가기

Python/Django

Django Model - Field 들 소개

https://docs.djangoproject.com/en/3.2/topics/db/models/#meta-options

 

Models | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

기본을 모르니까 할때마다 막히는 것 같아서 다시 정리 한다. 

언젠가 익숙해지겠지. 

 

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 는 두개의 인수를 가짐

  1. CharField.max_length
    - Required 값
    - 해당 필드의 (characters)최대 길이 max_length는 database와 MaxLengthValidator를 사용하는 Django의 유효성 검사에서 적용
    - Note!!
    여러 database backend에 이식할 수 있어야 하는 애플리케이션을 작성하는 경우
    일부 백엔드에 대한 max_length에 대한 제한이 있음
    참고 : https://docs.djangoproject.com/en/4.0/ref/databases/
  2. CharField.db_collation(New in Django 3.2)
    -Optional.
    - 해당 필드의 database collation 이름
    - Note! 
    Collation 이름은 표준화 되지 않았습니다. 
    - 오라클 
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: 대신 밑의 설정을 셋팅 

- default form 위젯 DateInput.
- 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=Falseauto_now_add=False**options)
- date 와 time  (python 의 datetime.datetime)

- DateField 동일 인수값 사용 
- 기본 form 위젯은 단일 DateTimeInput
- admin은 JavaScript 단축키가 있는 두 개의 개별 TextInput 위젯을 사용
DecimalField class DecimalField(max_digits=Nonedecimal_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=Nonemax_length=100**options)
class FilePathField(path=''match=Nonerecursive=Falseallow_files=Trueallow_folders=Falsemax_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=Nonedecoder=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=Falseauto_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  를 사용하지 않으니 기본값 사용 권장 

 

일단은 필드 정리만!