장고의 모델
장고의 모델(db)에는 다양한 필드가 존재한다
자세히 알아보자.
AutoField
ID(pk)로 사용 가능한 자동으로 증가하는 IntegerField다. 직접 사용할 필요는 없다. 모델의 기본키 필드는 별도로 지정하지 않으면 자동으로 추가됨.
BigAutoField
AutoField와 매우 유사한 64비트 정수다.
BigIntergerField
IntegerField와 매우 유사한 64비트 정수다.
BinaryField
raw binary 데이터를 저장하기 위한 필드이다. 바이트 할당만을 지원한다. 이 필드는 기능이 제한적이다. Binary값에 쿼리셋을 필터링할 수 없다. ModelForm에 BinaryField를 포함시킬 수 없다.
BooleanField
논리 필드이다. true, false필드이고, 기본 폼 위젯은 CheckboxInput 이다. null 값 허용이 필요하면 NullBooleanField를 사용하자. Field.default가 정의되지 않았을 때, BooleanField의 기본 값은 None 이다. default None을 사용하고 해당 필드에 값을 넣지 않을 경우, migrate 시 에러가 발생하지 않고 실제 모델이 저장될때 DBMS에서 제약조건 에러가 난다.
CharField
작은 문자열에서 큰 사이즈의 문자열을 위한 필드이다. 많은 양의 경우 TextField를 사용한다. 기본 위젯은 TextInput이고, CharField는 필수 인수가 추가로 하나 있다.
CharField.max_length : 필드의 최대길이 (문자 수)이다.
DateField
파이썬의 datetime.date 인스턴스에 의해 표현되는 날짜다.
DateField.auto_now : 모델이 저장될 때 마다 매번 자동으로 필드를 현재시간이 설정한다. 항상 현재 날짜가 사용됨에 주의하자. 기본값을 재정의 할 수 없다. Model.save()가 호출 될 때 마다 작동되며 자동으로 수정된다. QuerySet.update() 같은 다른 방법으로 필드를 수정하면 해당 필드는 수정되지 않는다.
DateField.auto_now_add : 모델이 처음 생성될 때 자동으로 현재시간이 설정된다. 생성의 타임스탬프로 유용하다. 항상 현재 날짜가 사용된다. 기본값을 재정의 할 수 없다. 그러므로 객체가 생성될때 이 필드에 값을 설정하더라고 무시함. 이 필드를 수정하고 싶다면 auto_now_add=True 대신에 다음과 같이 설정한다.
쉽게말해, auto_now는 저장될때마다 매번 자동으로 필드를 현재시간으로 설정되고,
auto_now_add는 db가 처음 생성될 때 딱 한번 자동으로 현재시간이 설정된다.
default = today (datetime.date.today()의 값이 사용됨)
default = timezone.now (django,utils.timezone.now()의 값이 사용됨)
이 필드의 기본 위젯은 TextInput이다. 어드민에는 자바 스크립트 캘린더와 "Today" 숏컷을 추가한다. 추가로 invaild_date 오류 메세지 키를 포함한다.
auto_now_add, auto_now,default는 같이 쓸 수 없다. 이러한 옵션들을 섞어 쓴다면 오류가 발생한다.
필드에 auto_now 또는 auto_now_add를 True로 설정하면 editable=False와 blank=True이 설정된다.
auto_now 와 auto_now_add 옵션은 생성 또는 수정하는 순간의 기본 타임존 날짜가 항상 사용된다. 다른 것을 원한다면 auto_now_add, auto_now 대신에 default로 callable 를 사용하거나 save() 메소드를 재정의하자. 또는 DateField 대신에 DateTimeField를 사용하고 표시 시간을 datetime에서 date로의 변환등의 방법을 결정해라.
DateTimeField
파이썬에서 datetime.datetime 인스턴스로 표현되는 날짜와 시간이다. DateField와 동일한 추가 인수를 가지고 있다. 기본 위젯은 두개의 TextInput 이다.
DecimalField
고정 소수로 파이썬에서 Decimal 인스턴스로 나타낸다. 두개의 필수 인수가 존재한다.
DecimalField.max_digits : 숫자에 허용되는 최대 자릿수다. 이 숫자는 decimal_places보다 크거나 같아야 한다.
DecimalField.decimal_places : 숫자와 함께 저장될 소수 자릿수다.
999.22 ex ) models.DecimalField(...., 5max_digits= , decimal_places=2)
DurationField
시간주기를 위한 필드이다. 파이썬에서 timedelta로 모델링한다. PostgreSQL에서는 데이터 타입이 interval이고 오라클에서는 INTERVAL DAY(9) TO SECOND(6)이다. 다른 DBMS에서는 마이크로초의 bigint가 사용된다. DurationField의 산술 연산은 대부분의 경우에 잘 작동된다. 하지만 PostgreSQL을 제외한 모든 데이터베이스에서 DurationField의 값을 DateTimeField 산술 인스턴스에 비교하는 것은 기대한 것 처럼 동작하지 않는다.
EmailField
유효한 이메일 주소인지 체크하는 CharField이다. 입력값을 검증하는데 EmailValidator를 사용한다.
FileField
파일 업로드 필드이다. primary_key를 지원하지 않고 사용할 경우 에러가 난다.
FileField.upload_to : 이 속성은 업로드 디렉터리와 파일 이름을 설정하는 방법을 제공하고 두가지 방법을 사용 할 수 있다. 두 경우 모두 Storage.save() 메소드가 호출 된다.
문자열 값을 지정하면 strftime() 형식을 포함 할 수 있다. 주어진 디렉터리에 포맷 형식을 업로드 일시로 변경 후 파일이 업로드 된다.
class MyModel (models.Model):
upload = models.FileField(upload_to='uploads/')
uoload = models.FileField(upload_to='uploads/%Y/%m/%d/')
기본 FileSystemStorage를 사용하면, 업로드된 파일이 저장될 로컬 파일 시스템에 위치가 MEDIA_ROOT 경로에 추가된다.
또한 upload_to 는 함수 같은 callable일 수 있다. 파일 이름을 포함하여 업로드 경로를 얻기 위해 불려진다. callable은 두 인수를 수용하고 스토리지 시스템으로 전달되는 Unix 스타일 경로 (슬래쉬를 포함)를 리턴해야 한다. 두 인수는 다음과 같다.
instance : FileField가 정의된 모델의 인스턴스, 현재 파일이 첨부되는 특별한 인스턴스다.
filename : 원본 파일에 주어진 이름. 최종 목적 경로를 결정할때 사용될 수 있고 아닐수도 있다.
파일과 관련된 필드는 여러 종류가 있다. 잘 정리된 블로그를 참고하자.
https://brunch.co.kr/@ddangdol/4
FloatField
파이썬에서 float 인스턴스로 표현된 부동 소숫점 숫자이다. 이 필드의 기본 폼 위젯은 localize가 False일때 NumberInput이고 그 외는 TextInput이다.
- FloatField vs DecimalField
FloatField 클래스는 때로는 DecimalField 클래스와 섞여 쓰인다. 비록 둘 모두 실수를 뜻하지만 다르게 숫자를 표현한다. FloatField는 내부적으로 파이썬의 float 타입을 사용하지만 DecimalField는 파이썬의 Decimal 타입을 사용한다. 두 필드의 비교에 대한 추가 정보는 파이썬의 decimal 모듈 문서를 참고하자.
ImageField
FileField로 모든 속성과 메소드를 상속받지만, 업로드된 객체가 유효한 이미지인지 검증한다. ImageField는 FileField에 사용 가능한 특별한 속성들 외 추가적으로 height와 width 속성이 있다. ImageField는 이러한 속성의 쿼리를 유용하게 하기 위해 두가지 선택적인 추가 인수를 가지고 있다.
ImageField.height_field : 모델 인스턴스가 저장될 때 이미지의 높이가 자동으로 채워지는 모델 필드의 이름이다.
ImageField.width_field : 모델 인스턴스가 저장될 때 이미지의 너비가 자동으로 채워지는 모델 필드의 이름이다.
Pillow 라이브러리를 요구한다. ImageField 인스턴스는 데이터베이스에 기본 최대길이가 100자인 varchar 칼럼으로 생성된다. 다른 필드와 마찬가지로 최대 길이를 max_length 인수를 사용하여 변경할 수 있다.
IntegerField
정수다. 이 필드의 기본 폼 위젯은 localize가 False일 때 NumberInput이고 그 외에는 TextInput이다.
GenericlPAddressField
문자열 형식에 IPv4 나 IPv6 주소이다. 이 필드의 기본 폼 위젯은 TextInput 이다. 모든 문자는 소문자로 변환된다.
GenericIPAddressField.protocol : 지정된 프로토콜을 위해 입력을 검증하여 제한한다. 허용되는 값은 'both'(기본 값), 'IPv4', 'IPv6'이다. 대소문자를 구분하지 않는다.
GenericIPAddressField.unpack_ipv4 : ::ffff:192.0.2.1과 같이 IPv4 매핑된 주소의 압축을 푼다. 이 옵션이 허용되면 앞 주소가 압축해제되어 192.0.2.1이 된다. 기본값은 사용 불가하다. 오직 protocol이 'both'로 사용 될 때만 사용 가능하다. 빈 값을 허용한다면 빈 값이 null로 저장되므로 null을 허용해야 한다.
NullBooleanField
BooleanField와 유사하지만, 옵션 중 하나로 NULL을 허용한다. BooleanField에 null=True 대신에 사용한다. 이필드의 기본 폼 위젯은 NullBooleanSelect다.
PositiveIntegerField
IntegerField와 비슷하지만 0 또는 양수이어야 한다.
PositiveSmallIntegerField
PositiveIntegerField와 유사하지만, 오직 특정지점 이하만을 허용한다.
SlugField
Slug는 신문에서 사용되는 용어이다. 슬러그는 오직 문자, 숫자, 밑줄, 하이픈만을 포함하는 짧은 레이블이다. 일반적으로 URL에 사용된다.
CharField와 마찬가지로, max_length를 지정할 수 있다. max_length가 지정되지 않으면 장고는 기본값으로 50자를 사용한다. 암묵적으로 Field.db_index 를 True로 설정한다. 다른 값들로 SlugField를 자동으로 미리 채우는 것이 유용하다. prepopulated_field를 사용하여 관리자에서 자동으로 이 작업을 할 수 있다.
SlugField.allow_unicode : 값이 True 라면, 필드는 ASCII 문자 외에 Unicode 문자를 허용한다. 기본값은 False 이다.
SmallIntegerField
IntegerField와 유사하지만, 오직 특정 지점 이하만을 허용한다.
TextField
큰 텍스트 필드이다. 이 필드의 기본 폼 위젯은 Textarea 이다. max_length 속성이 지정되면, 자동으로 생성된 폼 필드의 Textarea 위젯에서 반영된다. 하지만 모델이나 데이터베이스 레벨에서 강제 적용되지는 않다. 저런 경우는 CharField를 사용하자.
TimeField
파이썬에서 datetime.time 인스턴스로 나타내는 시간이다. DateField와 동일한 자동 채우기 옵션을 허용한다. 이 필드의 기본 폼 위젯은 TextInput이다.
URLField
URL을 위한 CharField이다. 이 필드의 기본 폼 위젯은 TextInput 이다. 모든 CharField의 서브클래스와 마찬가지로, URLField는 선택적 인수인 max_length 를 가지고 있다. max_length를 지정하지 않는다면, 기본 값인 200자가 사용된다.
UUIDField
universally unique identifiers를 저장하기 위한 필드다. 파이썬에서는 UUID 클래스를 사용한다. PostgreSQL을 사용하면 uuid 데이터 타입으로 저장되고 이외에는 char(32)로 저장된다.
'Sparta Coding Club > Today I Learned [TIL]' 카테고리의 다른 글
[TIL] #DAY - 045 - Js location.search (내일배움캠프AI 3기) (0) | 2022.11.08 |
---|---|
[TIL] #DAY - 044 - Js 랜덤, 난수 생성 (내일배움캠프AI 3기) (0) | 2022.11.08 |
[TIL] #DAY - 042 - SQLite3 DB를 csv로 저장하기 (내일배움캠프AI 3기) (0) | 2022.11.04 |
[TIL] #DAY - 041 - TMDB API 사용법! (내일배움캠프AI 3기) (2) | 2022.11.04 |