"2. 장고 모델 필드 & 제약조건"의 두 판 사이의 차이
(→필드) |
|||
(사용자 4명의 중간 판 10개는 보이지 않습니다) | |||
4번째 줄: | 4번째 줄: | ||
폼 등의 사용해서 자동화에 도움을 준다. | 폼 등의 사용해서 자동화에 도움을 준다. | ||
=필드= | =필드= | ||
− | 데이터를 저장할 테이블을 디자인해야 하는데, | + | 데이터를 저장할 테이블을 디자인해야 하는데, 테이블의 속성에 대한 제약은 모델의 필드에서 만들어준다. |
==텍스트 관련== | ==텍스트 관련== | ||
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 | ||
− | | | + | |필드명 속성을 외부의 객체로 둔다는 의미. |
|} | |} | ||
+ | 자기참조를하기 위한 방법. 'self'를 넣어 구성하면 된다. | ||
+ | |||
+ | <code>connected_username = models.ForeignKey('self', on_delete=models.CASCADE)</code> | ||
+ | |||
====옵션==== | ====옵션==== | ||
+ | 외래키, 1:1 연결에서 사용하는 옵션이다. | ||
{| class="wikitable" | {| class="wikitable" | ||
!내용 | !내용 | ||
98번째 줄: | 121번째 줄: | ||
|- | |- | ||
|어느 객체를 불러올 것인가. | |어느 객체를 불러올 것인가. | ||
− | |models.ForeignKey( | + | |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 | 텍스트 필드.
(글자제한을 위해) |
| ||||
models.TextField | 텍스트 필드.
(글자제한 없음) |
2.2 숫자 관련편집
내용 | 설명 | 옵션 |
---|---|---|
models.IntegerField | 숫자담기 | -2147483648 부터 2147483647 까지 정수를 지원한다. |
FloatField | 부동소수점 |
2.3 시간 관련편집
내용 | 설명 | 옵션 | ||||||
---|---|---|---|---|---|---|---|---|
models.DateTimeField | 시간담기 |
|
이외 내용은 장고 공식 메뉴얼의 필드 레퍼런스를 참조. https://docs.djangoproject.com/en/3.1/ref/models/fields/#db-index
2.4 타 모델과 연결하는 필드편집
연결하려는 쪽에서 사용해주면 된다.
외부모델을 연결한다든가 다양한 상황이 생길 수 있다. 이때 외부모델을 임포트해와야 하는데, 다음과 같은 형식으로 불러온 후 사용한다.
from 앱이름.models import 모델명
형식으로 임포트 해서 사용할 수 있다.- 타 모델과 연결할 땐 텍스트타입이 아니라, 모델 자체를 넣는다.(같은 앱의 모델을 연결할 땐 텍스트타입으로 '모델명' 형태로 기입한다.)
내용 | 설명 | 옵션 |
---|---|---|
models.ForeignKey | 외래키를 사용함. N:1 연결.
상위에 연결된 모델에선 자동으로 view에선 template에선 상위모델만 받아도 하위객체를 불러다 쓸 때 다시 같은 방법으로 더 하위객체를 불러올 수 있다. |
속성=models.ForeignKey(외래모델) |
modles.ManyToManyField
many to many 연결 |
N:N연결. 한 게시물에 여러 추천자가 올라오는 등의 추천 구현 등에서 사용한다.
연결한 모델이 하위, 연결당한 모델이 상위모델처럼 쓰인다.
|
속성=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= 옵션이 필수로 지정되어야 함.
| ||||||||||||||
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 자체와 관련된 옵션.
|
blank | Form과 관련된 옵션.(입력양식과 관련)
null과 유사하게 True를 넣으면 빈 칸으로 둘 수 있다.(폼의 입력에서 빈칸으로 둘 수 있다.) 이걸 쓰려면 null=True와 함께 써야만 한다. |
default | 값이 없을 때 무엇을 넣을지. |
help_text | 필드 입력 도움말. 폼 입력시 입력창 다음에 나타나는 메시지. |
3.2 특수 옵션편집
옵션 | 설명 |
---|---|
db_index | True를 넣으면 이 필드를 인덱스로 사용하겠다는 것. |
allow_unicode | True를 넣으면 영어 외의 값도 허용한다는 것. |