본문 바로가기
WEB/Django

[Django] ORM, Django Shell, QuerySet

by snow_white 2022. 4. 10.

1. DATA

from django.db import models

class Notice(models.Model):
    title = models.CharField(max_length=100) 
    likeCount = models.IntegerField() # 좋아요수
    viewCount= models.IntegerField() # 뷰수
    contents= models.TextField() # 내용
    
    def __str__(self):
        return f'젬목 : {self.title}, 좋아요 수 : {self.likeCount}, 조회수 : {self.viewCount}'

 

현재 data

 

2. ORM

ORM이란 우리가 만든 모델 클래스와 DB에 생성된 테이블을 자동으로 연관지어 주는 기술로 우리가 DB를 직접 조작할 필요 없이 모델 클래스의 python 문법을 통해서 DB를 조작할 수 있는 편리한 기술이다.

  • 터미널 창에서 명령어 실행
# python manage.py shell
# exit() # shell 끝내기

 

2.1. 조회

all, filter, exclude, get, count, first, last, exists(데이터의 유무, True, False로 반환), order by(정렬), reverse 등이 있다.

다중 데이터를 처리하기 위해 union, intersection, difference를 사용하기도 한다.

 

1. all

모든 요소에 접근할 때 사용

  • 모든 객체 가져오기 : Notice.objects.all()
  • 모든 객체 역순으로 가져오기 : Notice.objects.all().order_by('-pk')
  • 모든 객체 개수 확인 : Notice.objects.count()
>>> from main.models import Notice
>>> Notice.objects.all()
<QuerySet [<Notice: 제목 : test title 1, 좋아요 수 : 1, 조회수 : 2>, <Notice: 제목 : test title 2, 좋아요 수 : 2, 조회수 : 4>, <Notice: 제목 : tes
t title 3, 좋아요 수 : 3, 조회수 : 6>, <Notice: 제목 : test title 4, 좋아요 수 : 4, 조회수 : 8>, <Notice: 제목 : test title 5, 좋아요 수 : 5, 조회
수 : 10>]>
>>> Notice.objects.all().order_by('-pk')
<QuerySet [<Notice: 제목 : test title 5, 좋아요 수 : 5, 조회수 : 10>, <Notice: 제목 : test title 4, 좋아요 수 : 4, 조회수 : 8>, <Notice: 제목 : te
st title 3, 좋아요 수 : 3, 조회수 : 6>, <Notice: 제목 : test title 2, 좋아요 수 : 2, 조회수 : 4>, <Notice: 제목 : test title 1, 좋아요 수 : 1, 조
회수 : 2>]>
>>> Notice.objects.count()
5

 

2. get

특정 요소를 정확히 알고 있을 때 사용한다. 요소에 접근할 때에는 점을 사용한다.

  • 특정 객체 가져오는 방법 : Notice.objects.get(id=1) 또는 Notice.objects.get(pk=1)
>>> Notice.objects.get(id=1)
<Notice: 제목 : test title 1, 좋아요 수 : 1, 조회수 : 2>
>>> Notice.objects.get(pk=1)
<Notice: 제목 : test title 1, 좋아요 수 : 1, 조회수 : 2>
>>> q = Notice.objects.get(pk=1)
>>> q
<Notice: 제목 : test title 1, 좋아요 수 : 1, 조회수 : 2>
>>> q.id
1
>>> q.title
'test title 1'
>>> q.viewCount
2
>>> q.likeCount
1

 

3. filter, exclude

  • 위 메소드는 이어 붙여 사용할 수 있다.
  • filter().exclude().filter().exclude()
  • filter는 조건에 맞는 값을 반환하고, exclude는 조건에 맞지 않는 값을 반환한다.
  • 연산자를 붙일 때에는 __(언더바 2개)를 붙인다.
  • 연산자의 종류는 contains(포함), in(다중 조건 포함), exact, iexact, gt(>), lt(<), gte(≥), lte(≤), startswith(앞에 매칭), range(범위), date, year, week, week_day, quarter, time, hour, minute, second, regex 등이 있다.
  • get은 filter로도 잡아낼 수 있다.
  • 조건에 일치하는 객체 가져오기 : Notice.objects.filter()
    • viewCount가 4인 객체 가져오기 : Notice.objects.filter(viewCount=4)
    • likeCount가 3을 초과하는 객체 가져오기 : Notice.objects.filter(likeCount__lt=3)
    • likeCount가 3보다 작은 객체 가져오기 : Notice.objects.filter(likeCount__gt=3)
    • likeCount가 3 이상인 객체 가져오기 : Notice.objects.filter(likeCount__gte=3)
    • title이 'test5'인 객체 가져오기 : Notice.objects.filter(title='test5')
    • title에 'test'를 포함한 객체 가져오기 : Notice.objects.filter(title__contains='test')
>>> Notice.objects.filter(title='test')
<QuerySet []>
>>> Notice.objects.filter(title='test title 1')
<QuerySet [<Notice: 제목 : test title 1, 좋아요 수 : 1, 조회수 : 2>]>
>>> Notice.objects.filter(id=1)
<QuerySet [<Notice: 제목 : test title 1, 좋아요 수 : 1, 조회수 : 2>]>
>>> Notice.objects.filter(viewCount=4)
<QuerySet [<Notice: 제목 : test title 2, 좋아요 수 : 2, 조회수 : 4>]>
>>> Notice.objects.filter(title__contains='test')
<QuerySet [<Notice: 제목 : test title 1, 좋아요 수 : 1, 조회수 : 2>, <Notice: 제목 : test title 2, 좋아요 수 : 2, 조회수 : 4>, <Notice: 제목 : tes
t title 3, 좋아요 수 : 3, 조회수 : 6>, <Notice: 제목 : test title 4, 좋아요 수 : 4, 조회수 : 8>, <Notice: 제목 : test title 5, 좋아요 수 : 5, 조회
수 : 10>]>
  • 조건에 일치하지 않는 객체 가져오기 : Notice.objects.exclude()
    • title이 'test3'인 객체를 제외하고 가져오기 : Notice.objects.exclude(title='test3')

 

2.2. 생성

  • python shell을 통해서도 admin site와 같이 DB에 데이터를 삽입할 수 있다.
    • 객체이름.objects.create(필드1='값', 필드2='값', 필드3='값', 필드4='값’)
  • shell 종료 전, save() 메소드로 저장하지 않으면 충돌이 발생할 수 있다.
    • q.save()
>>> q = Notice.objects.create(title='sample', likeCount=100, viewCount=100, contents='hello world')
>>> q
<Notice: 제목 : sample, 좋아요 수 : 100, 조회수 : 100>
>>> Notice.objects.all()
<QuerySet [<Notice: 제목 : test title 1, 좋아요 수 : 1, 조회수 : 2>, <Notice: 제목 : test title 2, 좋아요 수 : 2, 조회수 : 4>, <Notice: 제목 : tes
t title 3, 좋아요 수 : 3, 조회수 : 6>, <Notice: 제목 : test title 4, 좋아요 수 : 4, 조회수 : 8>, <Notice: 제목 : test title 5, 좋아요 수 : 5, 조회
수 : 10>, <Notice: 제목 : sample, 좋아요 수 : 100, 조회수 : 100>]>

 

2.3. 수정

  • 수정은 수정할 row를 지정한 뒤, 딕셔너리를 수정하듯이 처리한다.
  • 수정할 때는 반드시 save() 매서드를 통해 저장해야 합니다.
    • q.save() 👈 save() 안 하면 수정 안됨
>>> q = Notice.objects.get(title='sample')
>>> q.contents = 'hello world!!!'
>>> q.contents
'hello world!!!'
>>> q.save()
>>> q
<Notice: 제목 : sample, 좋아요 수 : 100, 조회수 : 100>

 

2.4. 삭제

  • 데이터 삭제 방법 : 삭제할 객체 지정 후 객체.delete()
  • q = Notice.objects.get(title='sample') 👈 삭제 대상 지정
  • q.delete() 👈 삭제

 

  • Django QuerySet API reference

QuerySet API reference | Django documentation | Django

 

QuerySet API reference | Django documentation | Django

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

docs.djangoproject.com

 


database seeding

 

데이터베이스의 초기 데이터 설정

# 터미널에서 작성
python manage.py dumpdata main --output data.json

 

  • data.json 파일 속성 지정하기
python manage.py dumpdata main --output data.json --indent 4

 

  • data.json 파일에 데이터 추가
[
... 생략
{
    "model": "main.notice",
    "pk": 5,
    "fields": {
        "title": "test title 5",
        "likeCount": 5,
        "viewCount": 10,
        "contents": "test content 5"
    }
},
{
    "model": "main.notice",
    "pk": 6,
    "fields": {
        "title": "test title 6",
        "likeCount": 6,
        "viewCount": 12,
        "contents": "test content 6"
    }
}
]

 

  • data.json 변경 후 아래 명령어 실행
python manage.py loaddata data.json

 

  • 서버 구동 후 추가한 데이터 확인

'WEB > Django' 카테고리의 다른 글

[Django] FBV와 CBV  (0) 2022.04.10
[Django] url 개선  (0) 2022.04.10
[Django] template language  (0) 2022.04.10
[Django] Django 구조와 MTV  (0) 2022.04.10
[Django] admin 페이지에 Notice 등록하기  (0) 2022.04.10

댓글