Django Model Field

Nam Eun-Ji·2020년 12월 15일
2
from django.db import models

String Field

CharField

class CharField(max_length=None, **options)

# ex
title = models.CharField(max_length=100)
  • 기본 문자열 필드.
  • 필수 인자
    • max_length : 필드의 최대 길이
  • max_length보다 긴 문자열을 입력하면 유효성 검사 오류가 발생한다.

TextField

class TextField(**options)

# ex
detail_content = models.TextField()
  • 텍스트 양이 많은 경우 사용



Numeric Field

IntegerField

class IntegerField(**options)

# ex
order_id = models.IntegerField(default=0)
  • -2147483648에서 2147483647(4 Bytes)까지 정수 값을 저장하는 데 사용

DecimalField

class DecimalField(max_digits=None, decimal_places=None, **options)

# ex
price = models.DecimalField(max_digits=11, decimal_places=2)
  • 고정 소수점 이하의 십진수
  • 필수 인자
    • max_digits : 숫자에 허용되는 최대 자릿수. 이 수는 decimal_places보다 크거나 같아야한다.
    • decimal_places : 숫자와 함께 저장하는 소수 자릿수
    • 소수점 이하 3 자리수의 숫자를 999개까지 저장하려면 max_digits=5 및 decimal_places=3 사용해야한다.

FloatField

class FloatField(**options)
  • python에서 float인스턴스로 표현되는 부동소수점숫자
  • FloatField vs DecimalField
    FloatField는 내부적으로 Python의 Float 유형을 사용하는 반면, DimalField는 Python의 Decimal 유형을 사용한다.

BigIntegerField

class BigIntegerField(**options)
  • -9223372036854775808에서 9223372036854775807(8 Bytes)사이의 정수

SmallIntegerField

class SmallIntegerField(**options)

# ex
quantity = models.SmallIntegerField()
  • -32768에서 32767(2 Bytes)까지의 정수 값

PositiveBigIntegerField

class PositiveBigIntegerField(**options)
  • 0 to 9223372036854775807

PositiveIntegerField

class PositiveIntegerField(**options)
  • 0 to 2147483647

PositiveSmallIntegerField

class PositiveSmallIntegerField(**options)
  • 0 to 32767

AutoField

class AutoField(**options)
  • 자동으로 증가하는 정수 필드

BigAutoField

class BigAutoField(**options)
  • 1 to 9223372036854775807 까지 1씩 자동 증가

SmallAutoField

class SmallAutoField(**options)
  • 1 to 32767까지 1씩 자동 증가



BooleanField

class BooleanField(**options)

# ex
is_exit = models.BooleanField(default=False)
  • true/false 필드
  • default가 정해있지 않은 경우 BooleanField의 default값은 None이다.



DateTime

DateField

class DateField(auto_now=False, auto_now_add=False, **options)

# ex
updated_at = models.DateField(auto_now=True)
created_at = models.DateField(auto_now_add=)
  • 날짜 필드
  • 선택적 옵션
    • auto_now
      • 객체가 저장될 때 현재 날짜를 저장한다.
      • Model.save()가 될 때 자동으로 업데이트 되고, QuerySet.update()같은 경우에는 업데이트 되지 않는다.
      • last-modified
    • auto_now_add
      • 객체가 처음 저장될 때 현재 날짜를 저장한다.
      • created_at
    • auto_now_add, auto_now, default 옵션은 상호 배타적이라, 이러한 옵션을 조합하면 오류가 발생한다.

DateTimeField

class DateTimeField(auto_now=False, auto_now_add=False, **options)

# ex
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
  • DateField와 유사하지만, 시간까지 저장된다.



EmailField

class EmailField(max_length=254, **options)
  • 이메일 필드
  • EmailValidator를 사용하여 유효한 메일주소인지 확인할 수 있다.



BinaryField

class BinaryField(max_length=None, **options)

# ex
my_binary_data = models.BinaryField()
  • 바이너리 데이터를 저장하는 데 사용되는 특수 필드
  • 바이트만 허용
  • 데이터는 저장시 serialize된다.
  • 바이너리 데이터를 저장하므로이 필드는 필터에서 사용할 수 없다.



DurationField

class DurationField(**options)
  • 기간을 저장하기위한 필드



FileField

class FileField(upload_to=None, max_length=100, **options)
  • 파일 업로드 필드
  • primary_key 매개변수는 지원되지 않는다.
  • django 공식문서



FilePathField

class FilePathField(path='', match=None, recursive=False, allow_files=True, allow_folders=False, max_length=100, **options)
  • 파일시스템에서 특정한 디렉토리에 파일 이름으로 제한한다.
  • 세가지 특별인자가 있고 첫번째 인자는 필수이다.
    • path
      • 필수 인자
      • FilePathField가 선택해야하는 디렉토리를 위한 절대 경로
      • ex) "home/imgs"
    • match
      • FilePathField가 파일이름을 필터링할 때 사용할 문자열로 된 정규표현식
      • 정규표현식은 전체 경로가 아닌 기본 파일이름에 적용된다.
    • recursive
      • True/False (default = False)
      • path의 모든 서브 디렉토리가 포함되어야하는지 여부
    • allow_files
      • True/False (default = True)
      • 지정된 위치에 파일을 포함할지 여부
      • allow_files, allow_folders 둘 중 하나는 True여야 한다.
    • allow_folders
      • True/False (default = True)
      • 지정된 위치에 폴더를 포함할지 여부



ImageField

class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)

# ex
photo = models.ImageField(blank=True)
profile_pic = models.ImageField(upload_to="blog/profile_pic")
# 저장경로 : MEDIA_ROOT/blog/profile_pic/xxxx.jpg 경로에 저장
# DB필드 : 'MEDIA_URL/blog/profile_pic/xxxx.jpg' 문자열 저장
photo = models.ImageField(blank=True, upload_to="blog/%Y/%m/%d")
# 저장경로 : MEDIA_ROOT/blog/2017/05/10/xxxx.jpg 경로에 저장
# DB필드 : 'MEDIA_URL/blog/2017/05/10/xxxx.jpg' 문자열 저장
  • 이미지 저장을 지원하는 모델 필드 (FileField 상속)



GenericIPAddressField

class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)
  • 문자열 형식에 IPv4나 IPv6 주소



JSONField


class JSONField(encoder=None, decoder=None, **options)

# ex
from django.contrib.postgres.fields import JSONField
from django.db import models

class User(models.Model):
    metadata = JSONField()

class Post(models.Model):
    data = models.JSONField(default='{}')



SlugField

class SlugField(max_length=50, **options)

# ex
from django.utils.text import slugify
class Article(models.Model):
    headline = models.CharField(max_length=100)
    . . .
    slug = models.SlugField(unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.headline)
        super(Article, self).save(*args, **kwargs)
    . . .

>>> u1 = User.objects.get(id=1)
>>> from datetime import date
>>> a1 = Article.objects.create(headline="todays market report", pub_date=date(2018, 3, 6), reporter=u1)
>>> a1.save()
# 슬러그는 자동으로 생성됩니다. create 메서드를 따로 정의한 게 아닙니다.
>>> a1.slug
'todays-market-report'
  • 의미있는 URL을 만드는데 사용
  • 참고 사이트: https://itmining.tistory.com/119
  • 장점
    • 사람이 이해하기 좋다. (/1/ 보다 /blog/ 가 좋다)
    • 제목과 URL을 동일하게 맞춰 검색엔진 최적화(SEO)에 도움이 된다.



URLField

class URLField(max_length=200, **options)
  • URL을 저장하기 위한 CharField이다.
  • URLValidator를 이용하여 유효성 검사를 할 수 있다.



UUIDField

class UUIDField(**options)
  • 고유한 식별자를 저장하기 위한 필드
  • python의 UUID클래스를 사용한다.
  • postgresql을 사용하면 uuid타입으로 저장되고, 이외에는 char(32)로 저장된다.
  • UUID란?




ArrayField

class ArrayField(base_field, size=None, **options)[source]

# ex
from django.contrib.postgres.fields import ArrayField
from django.db import models

class ChessBoard(models.Model):
    board = ArrayField(
        ArrayField(
            models.CharField(max_length=10, blank=True),
            size=8,
        ),
        size=8,
    )
  • postgresql 특별 필드
  • django 공식문서
  • base_field
    • 필수 인자
    • Array안에 들어가는 하위 클래스를 지정해주어야 한다.
    • 예를 들어, Array안에 텍스트가 들어간다면 CharField를 넣어주면 된다.
    • 위 코드에서 보는 것처럼 중첩도 가능하다.
  • size
    • 선택
  • Querying ArrayField



참고사이트
https://django-orm-cookbook-ko.readthedocs.io/en/latest/slugfield.html
https://brunch.co.kr/@ddangdol/4

profile
한 줄 소개가 자연스러워지는 그날까지

0개의 댓글

관련 채용 정보