카테고리 없음

Django ORM(Object-Relational-Mapping)

rlarudals 2024. 8. 14. 19:49

ORM(Object-Relational-Mapping) ?????

- 쉽게말해서 파이썬으로 데이터베이스를 조작할 수 있게 해줌

 

여러가지 장단점이 있음

 

Django Shell

- django 가 제공하는 여러가지 기능을 명령어로 입력해서 실행해볼수 있는 Shell 환경

python manage.py shell

위에 코드를 터미널에 입력하면 현재 Django 프로젝트 환경을 Shell로 접근할 수 있게 해준다,

 

하지만 저걸 하기 전에 선행되어야 하는 작업이 있는데

pip install django-extensions

Django 기본 Shell보다 더 많은 기능이 있는 shell_plus를 제공

 

 

이렇게 까지 설정 이후에 아래 것 까지 추가

pip install ipython

이거는 ipython은 python 기본 Shell에 여러가지 기능을 더한것이다( 자동완성, 코드 색상 강조와 같은 기능 )

 

이후 저 두개의 패키지를 install 한 후 pip freeze > requirements.txt 를 해준다

python manage.py shell_plus

 

이제 shell 을 시작할때는 바로 위에 있는것을 사용하면 된다.

대충 이렇게 뜸

Article.objects.all() = 모든 정보를 조회하라는 의미 (article은 클래스 이름, objects 는 매니저(하인같은 녀석), .all()은 QuerysetAPI 이다.)

솔직히 <QuerySet []> 이게 안되가지고 거의 1시간을 다시 처음부터 만들었다.... 쉣

 <QuerySet []> = 데이터베이스에서 조회한 정보들이 모여있는 객체

 <QuerySet []> 안에 [] 요 친구는 반복이 가능 list 처럼 접근도 가능함

 

Article 생성방법(여러가지가 있음)

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

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

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

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

 

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

 

STR 사용하기

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
def __str__(self):
    return self.title

이것을 사용하는 이유는 저걸 사용하지 않으면  <Article: Article object (1)> 이런 형식으로 나오기 때문에 보기에 불편하고, 다른사람이 보면 이게 뭔지 모를수도 있다. 그래서 저걸 사용하고 조회를 하면 

이렇게 예쁘게 나온다!!

 

하나만 조회하기

Article.objects.get(id=1)

딱 1개의 조회가 필요할 때 사용, 조건에 해당하는 객체가 없다면 DoesNotExist 예외를 발생시킴,

한 개 이상의 객체가 리턴될 경우도 MulipleObjectReturned 예외를 발생시킴

이걸 방지 하기 위해서는 예외처리를 해야함(아직 안배워서 나중에 배우면 올리겠습니다 ㅎㅎ;;)

 

조건으로 조회하기

lookup과 일치하는 객체를 모두 리턴

일치하지 않는다면 빈 쿼리셋을 리턴합니다.

Article.objects.filter(id__gt=2) # 2보다 큰 id
Article.objects.filter(id__in=[1,2,3]) # 1,2,3에 속하는 id
Article.objects.filter(content__contains='my') # content에 'my'가 포함된

 

수정하기

1. 수정할 객체를 조회

2. 수정할 내용을 입력

3. 수정한 것을 데이터베이스에 반영

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

 

삭제하기

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