개발/Django, DRF

Django ORM model 정리

심집사 2022. 1. 13. 11:12

CharField

문자열을 저장하는 필드로 max_length로 최대 길이를 제한할 수 있다. 더 큰 문자열을 다룰 경우 TextField를 사용한다.

 

DateField

datetime.date를 저장하는 필드이다.

auto_now=True를 인자로 추가하면 Model.save로 저장할 때마다 현재 시간으로 갱신된다(QuerySet.update로는 갱신되지 않는다). updated_at 필드에 주로 사용한다. 

auto_now_add=True를 인자로 추가하면 처음 객체가 생성될 때 현재 시간으로 설정된다. 주로 created_at 필드에 사용한다.

 

위 두 인자를 사용하면 editable=False, blank=True로 설정된다. 

 

DateTimeField

datetime을 저장하는 필드로 인자의 사용방법은 위 DateField와 같다.

 

DecimalField

Decimal을 저장하는 필드로 DecimalValidator로 검사한다. 전체 숫자의 최대 자릿수인 max_digit, 소수점 자릿수인 decimal_place 인자를 필수로 받는다.

 

DurationField

timedelta에 해당하는 필드로 PostgreSQL의 interval에 해당한다.

 

EmailField

CharField와 같지만 EmailValidator로 검사한다. 기본으로 max_length=254이다.

 

FileField

파일을 업로드하는 필드로 upload_to로 저장할 장소를 선택할 수 있다.

 

FloatField

부동소수점을 표현하는 float에 해당한다.

 

ImageField

FileField의 모든 속성을 상속받고, 추가로 저장된 파일이 이미지인지 검사한다. max_length는 기본으로 100이다.

 

IntegerField

32bit integer를 표현한다.

 

GenericIPAddressField

인자로 protocol(both, IPv4, IPv6)을 받아 문자열이 이 ip에 해당하는지 검사한다.

 

NullBooleanField

BooleanField에 인자로 null=True를 넘긴 필드로 deprecated 될 예정이라 BooleanField 사용을 권장한다.

 

PositiveIntegerField

IntegerField와 같지만 0 또는 양수(2147483647 이하) 임을 보장한다.

 

PositiveSmallIntegerField

PositiveIntegerField와 같지만 더 작은 범위를 가진다. database마다 다르지만 0부터 32767까지는 보장한다.

 

SlugField

주로 url에 사용되는 문자, 숫자, -, _ 만을 허용한다. db_index가 true로 생성되고 allow_unicode 속성(기본값은 False)으로 unicode까지 저장할 수 있다.

 

SmallAutoField

IntegerField와 같지만 더 작은 범위를 가진다. database마다 다르지만 -32768부터 32767까지는 보장한다.

 

TextField

CharField보다 큰 텍스트를 다룬다. max_length 인자로 widget까지는 제어할 수 있지만 실제로 model, database까지 제어되지는 않는다.

 

TimeField

time에 해당하는 필드로 인자의 사용방법은 위 DateField와 같다.

 

URLField

URL을 처리하는 CharField로 URLValidator로 검사한다. max_length는 기본으로 200이다.

 

UUIDField

UUID에 해당하는 필드로 PostgreSQL에서는 uuid, 나머지 database에서는 char(32)에 해당한다. AutoField로 자동 증가하는 id 대신에 키를 사용하는 방법으로도 사용된다.

id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

 

 

 

 

Relationship Field

ForeignKey

외래 키를 지정하는 것을 통해 다대일 관계를 정의한다. 

어떤 주인이 여러 개의 상품을 가질 수 있고, 상품은 한 명에게만 속할 때 아래와 같이 ForeignKey를 사용한다.

class Product(models.Model):
  owner = models.ForeignKey(User, on_delete=models.CASCADE)

 

유저의 필드에 추천인을 넣는 경우처럼 자기 자신 모델을 참조하는 경우에는 self로 표현한다.

recommender = models.ForeignKey('self', on_delete=models.CASCADE)

 

 

ForeignKey로 설정하면 실제 database에는 column이름에 _id가 추가되어 owner_id, recommender_id로 저장된다. python 코드에서는 model로 접근하기 때문에 별도의 작업을 할 필요는 없다.

 

 

ManyToManyField

다대다 관계를 정의한다. django는 이 관계를 테이블을 이용해서 유지시키는데, through 옵션으로 custom 하게 바꿀 수 있다. 단순한 연결관계가 아닌 추가적인 데이터가 필요한 경우 사용한다.

class Person(models.Model):
    name = models.CharField(max_length=128)

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

 

 

OneToOneField

일대일 관계를 정의한다. unique=True인 ForeignKey와 비슷하다. 차이점은 역참조 할 때 발생한다. unique=True라서 ForeignKey의 역참조도 결괏값은 한 개가 나오지만 QuerySet으로 반환되고, OneToOneField는 객체가 반환된다.