코딩무비

[django] models 문서 - 1

by 코딩무비
반응형

문서 출처

 

Models | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

시작하기에 앞서

django 프로젝트와 app 한 개를 설치

 

명령어

django-admin startproject <프로젝트 이름>
cd <프로젝트 이름>
django-admin startapp <앱 이름>

저의 경우 <프로젝트 이름> : base, <앱 이름> : myapp 으로 설정

(메인 디렉토리 이름을 base -> docs_practice로 변경했어요)

 

실행결과

venv 디렉터리는 가상환경 설치한 거라 무시해도 됩니다!

Models

모델은 데이터에 대한 단 하나의 정보의 소스

모델은 저장하고 있는 데이터의 필수적인 행동과 필드 포함

일반적으로, 각각의 모델은 db의 테이블에 매핑

 

기본사항

파이썬 각각의 models 은 django.db.models.Model를 상속받음

모델의 각각의 필드들은 db의 필드에 해당합니다.

django는 자동으로 생성되는 db access api을 실행시켜 줍니다.

 

 

빠른 예제

first_name(성)과 last_name(이름)을 포함하고 있는 Person 모델을 정의

from django.db import models

class Person(models.Model): # Person 테이블
    first_name = models.CharField(max_length=30) # first_name 애트리뷰트
    last_name = models.CharField(max_length=30) # last_name 애트리뷰트

first_name 과 last_name은 모델의 필드 

각각의 필드는 클래스 속성을 지정되어 있으며 데이터베이스 열에 매핑됨

위 모델을 db로 만들면 다음과 같음(postrgresql)

CREATE TABLE myapp_person(
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" VARCHAR(30) NOT NULL,
    "last_name" VARCHAR(30) NOT NULL
);

테이블의 이름 myapp_person은 자동으로 모델의 메타데이터로 유도되며 오버라이딩 가능

db에 다른 이름으로 저장하기

더보기
class Person(models.Model): # Person 테이블
    first_name = models.CharField(max_length=30) # first_name 애트리뷰트
    last_name = models.CharField(max_length=30) # last_name 애트리뷰트

    class Meta:
        db_table = 'another_name' # 다른 이름으로 db에 저장

 

id 필드는 자동으로 추가되거나 이 행동 또한 오버라이딩될 수 있음

django 에서는 자동으로 id필드를 기본 키 로 추가

id = models.BigAutoField(primary_key=True) # 특별하지 않은 경우 모든 모델에 추가되어 있음

모델 사용하기

모델을 정의하면, django에게 사용할 모델들이 있다고 알려줄 필요가 있음

django의 settings 파일을 편집하고 INSTALLED_APP 세팅을 models.py가 포함된 앱 이름을 추가하도록 편집

앱 추가

예를 들어 애플리케이션이 모듈 myapp.modles에 있을 경우 , INSTALLED_APPS에 myapp 추가

 

INSTALLED_APPS에 새로운 앱을 추가할 때, 

 먼저 manage.py makemigration을 통해 마이그레이션 파일을 생성하고 run manage.py migrate 하는 것을 명심

 

 

Fields

모델의 가장 중요한 부분은 데이터베이스 필드 목록을 정의하는 것

필드들은 클래스의 애트리뷰트를 정의

cf ) clean, save, delete와 같은 모델 api에 정의된 이름과 충돌하지 않도록 주의

 

 

 

필드 타입

모델의 각각의 필드는 적합한 필드 클래스의 객체여야 함

Djangos는 몇가지를 결정하는 필드 클래스를 사용함

데이터베이스에 데이터를 저장하는 종류를 알려주기 위한  column 타입

form field을 랜더링하기 위한 HTML 위젯

가장적은 검증 필수요구사항 , djangoadmin에 사용되고 자동으로 생성되는 form인

 

 

django는 수십개의 내장된 필드 타입들을 가지고 있음 자세한 링크

django의 내장된 필드를 사용하지 않고쉽게 자신만의 필드를 작성 할 수 있음 자세한 링크

 

필드 옵션

각각의 필드는 특정한 인수들을 가지고 있음.

예를 들어, CharField는 max_length 인수가 필요

 

 

전체적인 필드 옵션은 여기확인

null
  • 만약 True일 경우, Django는 데이터베이스에 NULL값을 저장, default : False
blank
  • True일 경우, 그 필드는 빈 칸을 허용, defualt : False
choices
  • 이 필드로 사용할 선택으로 사용할 2개 요소를 가진 튜플
    • 왼쪽에 있는 것은 DB에 저장되는 것, 오른쪽 화면에 표시되는 것
  • default 양식 위젯은 표준 텍스트 필드 대신 선택 상자, 선택 항목으로 선택이 제한
YEAR_IN_SCHOOL_CHOICES = [
    ('FR','Freshman')
    ('SO','Sophomore')
    ('JR','Junior')
    ('SR','Senior')
    ('GR','Graduate')
]

객체의 화면에 표시되는 값 확인 - p.get_변수명_display()

default
  • 필드의 기본값, 값이거나 호출 가능한 객체일 수 있음, 호출가능한 경우 새로운 객체가 생성될 때마다 호출됨
help_text
  • 양식 위젯과 함께 보여지는 도움말, 문서화에 도움을 줌 
primary_key
  • True일 경우, 이 필드는 모델의 기본키

만약 모델의 다른 필드에 primary_key = True를 명시하지 않았을 경우, Django는 자동으로 기본키를 가진 숫자필드를  추가함, 따라서 primary_key= True을 반드시 작성하지 않아도 됨

기본키 필드는 읽기만 가능 , 만약 존재하는 객체의 기본키의 값을 변경하고 저장할 경우, 새로운 객체가 생성

 

unique
  • True일 경우, 이 필드는 반드시 테이블 전체에서 유일해야 함

 

 

 

 

 

자동적인 기본키 필드

기본으로 django에서는 App.default_auto_field 또는 settings의 DEFAULT_AUTO_FIELD 에서 입벼로 지정된 유형의 자동 증가 기본키를  모델에  제공

id = models.BigAutoField(primary_key = True)

만약 커스텀 기본키를 갖고 싶지 않으면 primary_key = True을 필드 하나에 명시해야 함 ,

만약 Django 가  명시적인 기본키를 본다면, 자동으로 생성되는 id 열을 만들지 않음

 

각가의 모델은 하나의 primary_key = True가 필요( 없을 경우 자동으로 id 필드가 생성)

 

Verbose field names

verbose name은 사용자가 사용하는 자세한 의미

ForeignKey, ManyToManyFiels 그리고 OneToOneField을 제외하고, 첫 번째 위치의 인자를 선택

verbose_name이 주어지지 않은 경우 Django는 자동으로 필드의 이름을 이용해서 만듦(밑줄 -> 공백)

 

class Fruit(models.Model):
    name = models.CharField("이름",max_length=100, primary_key=True) # 맨 앞에 verbose_name 작성
    long_name = models.CharField(max_length=100,null = True) # 작성 X 이 경우 long name으로 표시

admin 사이트

ForeignKey, ManyToManyFiels 그리고 OneToOneField는 첫 번째 인수로 모델의 클래스가 필요하므로, verbsose_name 인수를 작성해야 함

verbose_named의 첫 글자에 대문자를 사용하지 않는 게 관례

 

 

연관(Relationships)

분명히, 관계형 데이터베이스의 힘은 테이블을 서로 연관시키는 데 있음, Djagno은  일대다, 다대다, 일대일 등 세 가지 일반적인 데이터베이스 관계를 정의하는 방법을 제공

 

일대다 관계

일대다 관계를 정의하기 위하여 django.db.models.ForeignKey를 사용

다른 필드 유형과 마찬가지로 모델의 클래스 속성으로 포함시켜 사용

ForeignKey는 그 모델이 연관된 클래스의 위치 인수가 필요

관례상 외래키 필드의 이름은 해당 모델의 소문자로 쓰는 것이 관례

 

다대다 관계

대대다 관계를 정의하기 위하여 django.db.models.ManyToManyField를 사용

ManyToManyField는 그 모델이 연관된 클래스의 위치 인수가 필요

class Topping(models.Model):
    pass

class Pizza(models.Model):
    toppings  = models.ManyToManyField(Topping) # 토핑의 경우 여러 개의 피자 , 피자의 경우도 여러 개의 토핑

다대다 관계의 필드 이름은 복수로 표현하는 것이 좋음

다대다 관계는 두 모델중 하나의 필드에 넣어야 함 

다대다필드 객체는 Form에 수정될 객체에 생성됨

토핑과 피자의 경우 피자안에 있는 토핑을 고치는 것이 자연스러움

 

다대다 관계의 추가 필드

 

 

관련 스택오버플로우 글

https://stackoverflow.com/questions/37650362/understanding-manytomany-fields-in-django-with-a-through-model

 

Understanding ManyToMany fields in Django with a through model

I'm having trouble understanding the use of ManyToMany models fields with a through model. I can easily achieve the same without the ManyToMany field. Considering the following from Django's docs: ...

stackoverflow.com

 

반응형

블로그의 정보

코딩무비

코딩무비

활동하기