"2. 장고 모델 필드 & 제약조건"의 두 판 사이의 차이

Pywiki
둘러보기로 가기 검색하러 가기
 
(같은 사용자의 중간 판 2개는 보이지 않습니다)
70번째 줄: 70번째 줄:
  
 
* <code>from 앱이름.models import 모델명</code> 형식으로 임포트 해서 사용할 수 있다.
 
* <code>from 앱이름.models import 모델명</code> 형식으로 임포트 해서 사용할 수 있다.
* 타 모델과 연결할 땐 텍스트타입이 아니라, 모델 자체를 넣는다.
+
* 타 모델과 연결할 땐 텍스트타입이 아니라, 모델 자체를 넣는다.(같은 앱의 모델을 연결할 땐 텍스트타입으로 '모델명' 형태로 기입한다.)
 
{| class="wikitable"
 
{| class="wikitable"
 
!내용
 
!내용
88번째 줄: 88번째 줄:
 
|-
 
|-
 
|modles.ManyToManyField
 
|modles.ManyToManyField
 +
many to many 연결
 
|N:N연결. 한 게시물에 여러 추천자가 올라오는 등의 추천 구현 등에서 사용한다.
 
|N:N연결. 한 게시물에 여러 추천자가 올라오는 등의 추천 구현 등에서 사용한다.
 
연결한 모델이 하위, 연결당한 모델이 상위모델처럼 쓰인다.
 
연결한 모델이 하위, 연결당한 모델이 상위모델처럼 쓰인다.
114번째 줄: 115번째 줄:
  
 
====옵션====
 
====옵션====
 +
외래키, 1:1 연결에서 사용하는 옵션이다.
 
{| class="wikitable"
 
{| class="wikitable"
 
!내용
 
!내용

2022년 12월 4일 (일) 20:45 기준 최신판

1 개요[편집 | 원본 편집]

모델이 품을 데이터 형식을 지정한다.

폼 등의 사용해서 자동화에 도움을 준다.

2 필드[편집 | 원본 편집]

데이터를 저장할 테이블을 디자인해야 하는데, 테이블의 속성에 대한 제약은 모델의 필드에서 만들어준다.

2.1 텍스트 관련[편집 | 원본 편집]

내용 설명 옵션
models.CharField 텍스트 필드.

(글자제한을 위해)

옵션 설명
max_length=숫자 필수옵션. 해당숫자만큼으로 제한한다.
models.TextField 텍스트 필드.

(글자제한 없음)

2.2 숫자 관련[편집 | 원본 편집]

내용 설명 옵션
models.IntegerField 숫자담기 -2147483648 부터 2147483647 까지 정수를 지원한다.
FloatField 부동소수점

2.3 시간 관련[편집 | 원본 편집]

내용 설명 옵션
models.DateTimeField 시간담기
옵션 설명
auto_now_add True인 경우, 객체 생성시 자동 입력. 이후 다시 업데이트 하지 않는다.
auto_now 게시글 수정시간 등을 남길 때 사용. 수정할 때마다 자동입력.

이외 내용은 장고 공식 메뉴얼의 필드 레퍼런스를 참조. https://docs.djangoproject.com/en/3.1/ref/models/fields/#db-index

2.4 타 모델과 연결하는 필드[편집 | 원본 편집]

연결하려는 쪽에서 사용해주면 된다.

외부모델을 연결한다든가 다양한 상황이 생길 수 있다. 이때 외부모델을 임포트해와야 하는데, 다음과 같은 형식으로 불러온 후 사용한다.

  • from 앱이름.models import 모델명 형식으로 임포트 해서 사용할 수 있다.
  • 타 모델과 연결할 땐 텍스트타입이 아니라, 모델 자체를 넣는다.(같은 앱의 모델을 연결할 땐 텍스트타입으로 '모델명' 형태로 기입한다.)
내용 설명 옵션
models.ForeignKey 외래키를 사용함. N:1 연결.

상위에 연결된 모델에선 자동으로 하위모델명_set 속성을 갖게 된다.

view에선 상위모델.하위모델_set.all(),

template에선 상위모델만 받아도 {{상위모델.하위모델_set.all}} 형태로 상위객체의 속성으로서 하위객체를 다 불러올 수 있다.

하위객체를 불러다 쓸 때 다시 같은 방법으로 더 하위객체를 불러올 수 있다.

속성=models.ForeignKey(외래모델)
modles.ManyToManyField

many to many 연결

N:N연결. 한 게시물에 여러 추천자가 올라오는 등의 추천 구현 등에서 사용한다.

연결한 모델이 하위, 연결당한 모델이 상위모델처럼 쓰인다.

연결한모델.상위모델.all()로 연결한 상위모델을 불러올 수 있고,

상위모델.연결한모델_set.all()로 어떤 모델이 자신에게 연결되었는지 볼 수 있다.

속성=models.ManyToManyField(외래모델)
models.OneToOneField 1:1 연결. 불러오면 할당된 객체를 반환한다. 프로필 확장 등에서 사용. 속성=models.OneToOneField(외래모델)

2.4.1 models.ForeingKey[편집 | 원본 편집]

외부객체와 연결하기 위한 필드. 일반적으로 외부 모델에 대한 하위모델을 지정할 때 사용한다.

내용 설명
필드명 = models.ForeignKey 필드명 속성을 외부의 객체로 둔다는 의미.

자기참조를하기 위한 방법. 'self'를 넣어 구성하면 된다.

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

2.4.1.1 옵션[편집 | 원본 편집]

외래키, 1:1 연결에서 사용하는 옵션이다.

내용 설명
어느 객체를 불러올 것인가. models.ForeignKey(연결할모델명, 이외옵션) 형태로 작성한다.
on_delete=models.세부옵션 on_delete= 옵션이 필수로 지정되어야 함.
세부옵션 설명
CASCADE 외래 모델이 지워지면 함께 지운다는 의미.(기존 글이 사라질 때 댓글이 같이 사라지게 한다)
PROTECT 하위 객체가 있으면 지워지지 않게 한다.(하위객체에서 설정)
SET_NULL 상위 객체가 삭제되면 필드값을 null로 설정. 사용하려면 null=True 옵션을 함께 주어야 한다.
SET_DEFAULT 상위 객체가 삭제되면 필드값을 기본값으로 변경.
SET() 상위 객체가 삭제되면 괄호 안의 값으로 변경.
DO_NOTHING 아무것도 하지 않음.
related_name='author_posting'

2.4.1.2 사용예[편집 | 원본 편집]

댓글달기 댓글을 다는 기능을 구현하기 위해 댓글 테이블을 만들려면 기존 글에 대한 ForeignKey를 사용해야 한다.
class 댓글(models.Model):
    기존글 = models.ForeignKey(기존모델, on_delete-models.CASCADE)

2.5 선택모델 만들기[편집 | 원본 편집]

카테고리를 지정할 때 사용한다.

from django.db import models

class Student(models.Model):
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    GRADUATE = 'GR'
    YEAR_IN_SCHOOL_CHOICES = [
        ('내부에서처리할텍스트', '사용자에게보여질텍스트'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
        (GRADUATE, 'Graduate'),
    ]
    year_in_school = models.CharField(max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=SOPHOMORE,)

선택지를 그룹화기 위해선 다음과 같이 사용한다.

MEDIA_CHOICES = [
    ('Audio', (
            ('vinyl', 'Vinyl'),
            ('cd', 'CD'),
        )
    ),
    ('Video', (
            ('vhs', 'VHS Tape'),
            ('dvd', 'DVD'),
        )
    ),
    ('unknown', 'Unknown'),
]

3 옵션[편집 | 원본 편집]

3.1 공통옵션(제약조건)[편집 | 원본 편집]

모든 필드 안에 들어가는 공통옵션

옵션 설명
null DB 자체와 관련된 옵션.

null=True 의 옵션을 넣으면 해당 값이 비어있어도 된다는 의미. 디폴트는 False. 유니크 옵션과 함께 쓸 경우엔 항상 False로 두어야 한다.

blank Form과 관련된 옵션.(입력양식과 관련)

null과 유사하게 True를 넣으면 빈 칸으로 둘 수 있다.(폼의 입력에서 빈칸으로 둘 수 있다.) 이걸 쓰려면 null=True와 함께 써야만 한다.

default 값이 없을 때 무엇을 넣을지.
help_text 필드 입력 도움말. 폼 입력시 입력창 다음에 나타나는 메시지.

3.2 특수 옵션[편집 | 원본 편집]

옵션 설명
db_index True를 넣으면 이 필드를 인덱스로 사용하겠다는 것.
allow_unicode True를 넣으면 영어 외의 값도 허용한다는 것.