Django #6 - Django Model / ORM

김엣취·2024년 8월 15일

Django

목록 보기
7/17

Model

models.py의 뼈대

from django.db import models


class Article(models.Model):
    pass
from django.db import models


class Article(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()

각각의 필드는 테이블의 컬럼임.
다양한 필드들

실시간 수정 컬럼

근데 이제 자주 수정되어야 하는것들. 생성일과 수정일 같은 친구들은
auto_now_add=True & auto_now=True 사용하면 됨.


이렇게

DB에 적용하기

1. 마이그레이션 생성

Model 변경사항을 마이그레이션으로 생성해준다

python manage.py makemigrations 

2. 마이그레이션 반영

DB에 적용시키기위해 생성한 마이그레이션을 반영시켜준다

python manage.py migrate

+@

마이그레이션 목록과 적용여부를 보여주는 명령어

python manage.py showmigration

해당 마이그레이션이 어떤 sql문을 작성했는지 보여주는 명령어

python manage.py sqlmigrate <app_name> <migration_no> 

실시간 수정 컬럼의 마이그레이션 반영


1번 선택 후 Enter치기
(기본값으로 Model을 변경한 지금 시간을 계산해서 넣어달라는거임)

ORM (Object-Relational-Mapping)

SQL안쓰고 Python으로 DB조작을 가능하게 해줌

객체 지향 언어(캡슐화)와 DB의 개념적인 간극을 줄여준 것.

Model 클래스를 생성하면 Django는 자동적으로 CRUD 할 수 있는 Database API를 제공함.

그리고 집사를 하나 붙여주는데, 그게 Manager임.
(풀 네임 Django ORM Manager)
하는 일은 우리가 작성한 Model 클래스를 이용하여 데이터 베이스 쿼리작업을 도와주는 역할을 함

우리는 Manager를 이용해서 Django ORM의 Queryset API를 사용하게 될 것임.
*Queryset == ORM을 사용해서 데이터베이스로부터 전달받은 객체.

이 매니저의 기본(default)이름은 objects임

CRUD with Shell

준비과정

0. 장고의 shell들어가는 법

python manage.py shell

1. 장고 확장자 install하기 (가상환경이든 어디든..)

pip install django-extensions
pip install ipython

2. settings.py에 앱 등록

"django_extensions",

3. requirements update

pip freeze > requirements.txt

4. shell_plus로 들어가기

python manage.py shell_plus

집사(objects) 사용 설명서

Article 조회 시 편하게 보는법 - __str__

Article Object이라고 써져있던 것 보다, 어떤 내용인지 훨씬 보기 쉬워짐

class Article(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

전체 Article 조회하기

조회 결과는 Queryset으로 반복가능한 객체 형태임

Article.objects.all()

하나의 Article 생성(1)

article = Article()
article.title = 'first_title'
article.content = 'my_content'

# 여기에서 전체 Article을 조회해보면
Article.objects.all() # 비어있다

# save()하기전에는 저장되지 않음
article.save()

# 다시 전체 Article을 조회해보면 하나의 아티클이 있음
Article.objects.all()


# 속성 하나씩 접근
# 제목 
article.title

# 내용
article.content

# 생성일시
article.create_at

# pk(id)
article.id

하나의 Article 생성하기(2)

Article.objects.create(title='third title', content='마지막 방법임')
# save()가 필요하지 않음

하나의 Article만 조회

Article.objects.get(id=1)

get을 쓰는데 괄호 안에 2개 이상 올 수 있는 조건을 쓰면 예외 발생함. 이를 위해 있는게 filter.

조건으로 조회

Article.objects.filter(content='my_content')

다양한 lookup들..
*lookup: 조건에 사용되는 매개변수를 lookup 이라고 함

일치하지 않는다면 빈 쿼리셋을 리턴함

Article 수정

변수에 특정시키고, 변경하고, 저장

article = Article.objects.get(id=1)
article.title = 'updated title'
article.save()

Article 삭제

변수에 특정시키고, 삭제

article = Article.objects.get(id=2)
article.delete()

0개의 댓글