Django - 공식문서 뿌시기 스터디(1. Model)
Web/Django

Django - 공식문서 뿌시기 스터디(1. Model)

뉴비뉴 2020. 1. 2.

모델

  • 테이블 이름은 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})

manufacturer의 값은 null로 아무것도 나오지 않는다.

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

댓글

💲 추천 글