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

 
(사용자 4명의 중간 판 10개는 보이지 않습니다)
4번째 줄: 4번째 줄:
 
폼 등의 사용해서 자동화에 도움을 준다.
 
폼 등의 사용해서 자동화에 도움을 준다.
 
=필드=
 
=필드=
데이터를 저장할 테이블을 디자인해야 하는데, DB에 대한 제약은 모델의 필드에서 만들어준다.
+
데이터를 저장할 테이블을 디자인해야 하는데, 테이블의 속성에 대한 제약은 모델의 필드에서 만들어준다.
  
 
==텍스트 관련==
 
==텍스트 관련==
39번째 줄: 39번째 줄:
 
|숫자담기
 
|숫자담기
 
|<nowiki>-2147483648 부터 2147483647 까지 정수를 지원한다.</nowiki>
 
|<nowiki>-2147483648 부터 2147483647 까지 정수를 지원한다.</nowiki>
 +
|-
 +
|FloatField
 +
|부동소수점
 +
|
 
|}
 
|}
 
==시간 관련==
 
==시간 관련==
54번째 줄: 58번째 줄:
 
|-
 
|-
 
|auto_now_add
 
|auto_now_add
|True인 경우, 객체 생성시 자동 입력
+
|True인 경우, 객체 생성시 자동 입력. 이후 다시 업데이트 하지 않는다.
 +
|-
 +
|auto_now
 +
|게시글 수정시간 등을 남길 때 사용. 수정할 때마다 자동입력.
 
|}
 
|}
 
|}이외 내용은 장고 공식 메뉴얼의 필드 레퍼런스를 참조. https://docs.djangoproject.com/en/3.1/ref/models/fields/#db-index
 
|}이외 내용은 장고 공식 메뉴얼의 필드 레퍼런스를 참조. https://docs.djangoproject.com/en/3.1/ref/models/fields/#db-index
 
==타 모델과 연결하는 필드==
 
==타 모델과 연결하는 필드==
 
연결하려는 쪽에서 사용해주면 된다.
 
연결하려는 쪽에서 사용해주면 된다.
 +
 +
외부모델을 연결한다든가 다양한 상황이 생길 수 있다. 이때 외부모델을 임포트해와야 하는데, 다음과 같은 형식으로 불러온 후 사용한다.
 +
 +
* <code>from 앱이름.models import 모델명</code> 형식으로 임포트 해서 사용할 수 있다.
 +
* 타 모델과 연결할 땐 텍스트타입이 아니라, 모델 자체를 넣는다.(같은 앱의 모델을 연결할 땐 텍스트타입으로 '모델명' 형태로 기입한다.)
 
{| class="wikitable"
 
{| class="wikitable"
 
!내용
 
!내용
76번째 줄: 88번째 줄:
 
|-
 
|-
 
|modles.ManyToManyField
 
|modles.ManyToManyField
 +
many to many 연결
 
|N:N연결. 한 게시물에 여러 추천자가 올라오는 등의 추천 구현 등에서 사용한다.
 
|N:N연결. 한 게시물에 여러 추천자가 올라오는 등의 추천 구현 등에서 사용한다.
 +
연결한 모델이 하위, 연결당한 모델이 상위모델처럼 쓰인다.
 +
 +
<code>연결한모델.상위모델.all()</code>로 연결한 상위모델을 불러올 수 있고,
 +
 +
<code>상위모델.연결한모델_set.all()</code>로 어떤 모델이 자신에게 연결되었는지 볼 수 있다.
 
|속성=models.ManyToManyField(외래모델)
 
|속성=models.ManyToManyField(외래모델)
 
|-
 
|-
90번째 줄: 108번째 줄:
 
|-
 
|-
 
|필드명 = models.ForeignKey
 
|필드명 = models.ForeignKey
|author속성을 외부의 객체를 불러온다는 의미.
+
|필드명 속성을 외부의 객체로 둔다는 의미.
 
|}
 
|}
 +
자기참조를하기 위한 방법. 'self'를 넣어 구성하면 된다.
 +
 +
<code>connected_username = models.ForeignKey('self', on_delete=models.CASCADE)</code>
 +
 
====옵션====
 
====옵션====
 +
외래키, 1:1 연결에서 사용하는 옵션이다.
 
{| class="wikitable"
 
{| class="wikitable"
 
!내용
 
!내용
98번째 줄: 121번째 줄:
 
|-
 
|-
 
|어느 객체를 불러올 것인가.
 
|어느 객체를 불러올 것인가.
|models.ForeignKey(모델명, 이외옵션) 형태로 모델을 import해서 넣는다.
+
|models.ForeignKey(연결할모델명, 이외옵션) 형태로 작성한다.
 
|-
 
|-
 
|on_delete=models.세부옵션
 
|on_delete=models.세부옵션
108번째 줄: 131번째 줄:
 
|-
 
|-
 
|CASCADE
 
|CASCADE
|외래모델이 지워지면 함께 지운다는 의미.
+
|외래 모델이 지워지면 함께 지운다는 의미.(기존 글이 사라질 때 댓글이 같이 사라지게 한다)
 
|-
 
|-
 
|PROTECT
 
|PROTECT
129번째 줄: 152번째 줄:
 
|
 
|
 
|}
 
|}
 +
 +
==== 사용예 ====
 +
{| class="wikitable"
 +
!
 +
!
 +
!
 +
|-
 +
|댓글달기
 +
|댓글을 다는 기능을 구현하기 위해 댓글 테이블을 만들려면 기존 글에 대한 ForeignKey를 사용해야 한다.
 +
|<syntaxhighlight lang="python">
 +
class 댓글(models.Model):
 +
    기존글 = models.ForeignKey(기존모델, on_delete-models.CASCADE)
 +
</syntaxhighlight>
 +
|}
 +
 
==선택모델 만들기==
 
==선택모델 만들기==
 
카테고리를 지정할 때 사용한다.<syntaxhighlight lang="python">
 
카테고리를 지정할 때 사용한다.<syntaxhighlight lang="python">
164번째 줄: 202번째 줄:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
= 공통옵션(제약조건) =
+
= 옵션 =
 +
 
 +
== 공통옵션(제약조건) ==
 
모든 필드 안에 들어가는 공통옵션
 
모든 필드 안에 들어가는 공통옵션
 
{| class="wikitable"
 
{| class="wikitable"
 
!옵션
 
!옵션
!
+
!설명
 
|-
 
|-
 
|null
 
|null
185번째 줄: 225번째 줄:
 
|help_text
 
|help_text
 
|필드 입력 도움말. 폼 입력시 입력창 다음에 나타나는 메시지.
 
|필드 입력 도움말. 폼 입력시 입력창 다음에 나타나는 메시지.
 +
|}
 +
 +
== 특수 옵션 ==
 +
{| class="wikitable"
 +
!옵션
 +
!설명
 +
|-
 +
|db_index
 +
|True를 넣으면 이 필드를 인덱스로 사용하겠다는 것.
 +
|-
 +
|allow_unicode
 +
|True를 넣으면 영어 외의 값도 허용한다는 것.
 
|}
 
|}
 
[[분류:장고 모델]]
 
[[분류:장고 모델]]

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를 넣으면 영어 외의 값도 허용한다는 것.