모델

- 테이블 이름은 appname_person 으로 생성됩니다. 하지만 이 부분을 무시하여 테이블을 생성할 수도 있습니다.
[참고] 데이터베이스 테이블 이름을 대체하려면 db_table매개 변수를 사용하면 됩니다.
[TMI] MariaDB, MySQL에는 소문자 테이블 이름을 사용합니다. Oracle은 테이블 이름을 30자로 제한합니다.
class Meta:
db_table = 'person'
- id 필드가 자동으로 추가됩니다. ex) id = models.AutoField(primary_key=True)
모델 사용하기
앱 생성과 동시에 INSTALLED_APPS 에 등록해줘야됩니다. 등록하고나서
python manage.py makemigrations, python manage.py migrate
Fields

- CharField의 경우 max_length를 필수로 지정해줘야 합니다.
- ForeignKey(model, on_delete=models.CASECADE, 등등 옵션들을 필수로 지정해줘야 합니다.
- DateTimeField의 경우 auto_now, auto_now_add 가 있는데 _add는 보통 글생성 시 사용하고, auto_now는 수정시간에 사용합니다.
- PositiveIntegerField
ACTIVE = 1
DELETE = 2
REST = 3
BAN = 4
USER_STATUS = (
(ACTIVE, 'ACTIVE'),
(DELETE, 'DELETE'), # 회원탈퇴
(REST, 'REST'), # 휴면계정
(BAN, 'BAN'), # 밴
)
status = models.PositiveIntegerField(choices=USER_STATUS, default=1)
Field Option
각 필드는 특정 필드 특정 인수 세트를 취합니다.
- CharField는 RDS의 VARCHAR라고 생각하면 됩니다.
- BooleanField True / False 필드입니다. 추가로 NullBooleanSelect 필드가 있습니다.
BooleanField에서 선택을 안하고 넘어가게 하고 싶다면, forms 에서 (required=False)로 설정해주면 됩니다. - null의 기본값은 False입니다. null=True로 널이 들어가게 설정할 수 있습니다.
- blank의 기본값은 False 입니다.
[!] null은 우리가 생각하는 데이터베이스의 null 값이고, blank는 유효성 검사 관련 된 사항입니다.
blank=True 양식 유효성 검사를 통해 빈 값을 입력할 수 있습니다. - choices는 여러 방법으로 사용할 수 있습니다. 위에 PositiveIntegerFIeld 설명에 나와있는 예시처럼 사용할 수도 있고,

위 처럼 CharField에 choices를 지정하여 사용할 수도 있습니다.
제가 생각하기에는 PositiveIntegerField를 사용하는 것이 좋은 방법이라 생각이 듭니다.
- default는 기본 값 입니다.
- help_text 도움말 텍스트가 표시됩니다. 문서화에 유용합니다.
- primary_key는 기본 키 입니다. 하지만 장고의 경우 자동으로 IntegerField를 기본키로 사용합니다.
- unique 는 고유해야합니다. 고유해야한다는 것은 테이블에서 딱 한 개여야만 합니다.
Verbose field names
- ForeignKey, ManyToManyField, OneToOneField 제외하고, 다른 필드들의 첫 번째 인수는 verbose로 필드의 이름을 대체하는?
Database로 생각하면 alias 와 같은 역할을 하게 된다. - verbose_name = "" 으로 지정해줄 수 있다.

Relationships
- 관계형 데이터베이스의 힘은 테이블을 서로 관련시키는데 있습니다.
- many-to-one, many-to-many, one-to-one
Many-to-one relationships
- 다 대일 관계를 정의하려면 ForeignKeyField 모델을 사용해야 합니다.
- models.ForeignKey(모델명, on_delete=) 옵션을 필수로 와야 합니다.

# models.py
from django.db import models
class Manufacturer(models.Model):
name = models.CharField(
max_length=16
)
def __str__(self):
return self.name
class Car(models.Model):
manufacturer = models.ForeignKey(
Manufacturer,
on_delete=models.CASCADE
)
name = models.CharField(
max_length=16
)
created_at = models.DateTimeField(
auto_now_add=True
)
updated_at = models.DateTimeField(
auto_now=True
)
def __str__(self):
return self.name
간단하게 파이썬이 인터프리터 언어인지 확인해볼 수 있는 것이 하나 있다.
위 예제에서 Class Car와 Class Manufacturer의 위치를 바꾸게되면 오류가 발생하게 된다.
그 이유는 Manufacturer가 생성되지 않은 상태에서 호출하려고 했기 때문이다.
# admin.py
from django.contrib import admin
from .models import Car, Manufacturer
admin.site.register(Car)
admin.site.register(Manufacturer)
admin.py 에 등록해주고 Car 에서 확인해보면 아래 사진과 같이 다대일 관계가 연결된 것을 확인할 수 있다.

추가로 on_delete options 에 대해 알아보고 넘어가겠습니다.
1. CASCADE
ForeignKeyField가 바라보는 값이 삭제될 때 ForeignKeyField를 포함하는 모델 인스턴스(row)도 삭제된다.
ex) Manufacturer hyundai가 삭제되면 Car i30도 같이 삭제된다.
2. PROTECT
ForeignKeyField가 바라보는 값이 삭제될 때 삭제가 되지 않도록 ProtectedError를 발생시킨다.
class Car(models.Model):
manufacturer = models.ForeignKey(
Manufacturer,
on_delete=models.PROTECT
)

3. SET_NULL
ForeignKeyField가 바라보는 값이 삭제될 때 ForeignKeyField값을 null로 바꾼다.
(null=True일 때만 가능)
class Car(models.Model):
manufacturer = models.ForeignKey(
Manufacturer,
on_delete=models.SET_NULL,
null=True # null=True 여야만 사용할 수 있습니다.
)
>>> Manufacturer.objects.all()
<QuerySet [<Manufacturer: hyundai>]>
>>> Manufacturer.objects.get(pk=2).delete()
(1, {'main.Manufacturer': 1})

4. SET_DEFAULT
ForeignKeyField가 바라보는 값이 삭제될 때 ForeignKeyField 값을 deffault 값으로 바꾼다.
(default값이 있을 때만 가능)
5. SET()
ForeignKeyField가 바라보는 값이 삭제될 때 ForeignKeyField 값을 SET에 설정된 함수 등에 의해 설정된다.
6. DO_NOTHING
ForeignKeyField가 바라보는 값이 삭제될 때 아무런 행동을 취하지 않는다.
참조무결성을 해칠 위험이 있다.
참고자료: https://lee-seul.github.io/django/backend/2018/01/28/django-model-on-delete.html
Many-to-Many relationships
- models.ManyToManyField(모델명)

class Topping(models.Model):
name = models.CharField(
max_length=32
)
def __str__(self):
return self.name
class Pizza(models.Model):
toppings = models.ManyToManyField(Topping)
name = models.CharField(
max_length=32
)
def __str__(self):
return self.name
manytomany field shell 환경에서 다루기
ManyToManyField.through
Django는 다 대다 관계를 관리하기 위해 자동으로 테이블을 생성합니다. 그러나 중계 테이블을 수동으로 지정하려는 경우 through 옵션을 사용하여 사용하려는 중간 테이블을 나타내는 Django 모델을 지정할 수 있습니다.
'Web > Django' 카테고리의 다른 글
| Django - messages 활용 (2) | 2020.02.01 |
|---|---|
| Django - pipeline (0) | 2020.01.31 |
| Django - allauth signupform custom (0) | 2020.01.02 |
| Django allauth User has no field named 'username' 해결방법 (0) | 2019.12.30 |
| Django-crontab 사용 (0) | 2019.12.06 |
댓글