오늘도 개발

Django와 데이터베이스 - 3) Django QuerySet API 본문

카테고리 없음

Django와 데이터베이스 - 3) Django QuerySet API

Sueeeeeee 2022. 7. 2. 19:27

1. Django QuerySet API

objects라는 매니저 클래스에는 DB를 다룰 수 있게 해주는 메서드가 들어있다.

이 메서드(all, filter, get, delete...)들을 Django QuerySet API라고 한다.

 

메서드 실행 시 Django ORM이 해당 문장을 SQL로 번역한 후

Database에서 쿼리를 실행해준다.

QuerySet 반환하는 메서드

- all()

- filter()

- exclude()

- values() : all, 이나 filter로 읽어온 queryset에 사용. QuerySet 안에 딕셔너리 넣어서 반환

- values_list() : QuerySet 안에 튜플 넣어서 반환

QuerySet 반환하지 않는 메서드

- create()

- get()

- update() : filter로 읽어온 queryset에 사용. 여러 객체를 동시에 업데이트할 때 사용. 

- delete() : 삭제 후 dictionary 반환

- save() : 단일 객체를 업데이트할 때 사용

- exists() : filter() 조건에 맞는 데이터 조회. True, False 반환

- get_or_create() : 조건에 맞는 데이터가 있으면 get(False 반환), 없으면 create(True 반환)

- bulk_create() : 여러 개 row 생성

- count() : 매치하는 row 개수 반환

- first() : 첫번째 오브젝트 반환

- last() : 마지막 오브젝트 반환

- aggregate() : 합계 반환

 2. Django QuerySet API로 CRUD 해보기

Create(생성)

<models.py>

class Person(models.Model):
   name = models.CharField(max_length=100)
   age = models.IntegerField()

python3 manage.py shell 실행

create : 테이블에 데이터 추가하고 생성된 인스턴스 반환

>> from person.models import Person
>> Person.objects.create(name='sue', age=1000)

bulkcreate : 데이터 오브젝트를 배열로 입력하면 테이블에 한꺼번에 데이터 추가

>>> m3 = Menu(name='상품')
>>> m4 = Menu(name='카드')
>>> Menu.objects.bulk_create([m3, m4])

>>> Category.objects.bulk_create([
	Category(name="에스프레소", menu=m1),
	Category(name="프라푸치노", menu=m1)])

Read(읽기)

get : 조건에 일치하는 row 하나를 읽어옴.

filter : 조건에 일치하는 여러 row를 읽어옴.

>> from person.models import Person
>> Person.objects.get(id=1)
>> <Person: Person object(1)>
>> Person.objects.filter(age=1000)
>> <QuerySet [<Person object(1)>], [<Person object(2)>]>
>> p = Person.objects.filter(age=10)
>> <QuerySet [<Person object(3)>], [<Person object(6)>]>
>> p[0].name
>> Harry Potter

Update(업데이트)

1. save : row를 하나만 변경

2. update : 여러 row 일괄 변경 

  1) filter로 queryset 읽어옴.

  2) queryset에 업데이트 적용

  3) queryset에 들어있는 모든 row에 업데이트 일괄적용.

>> from person.models import Person
>> Person.objects.filter(age=1000)
>> <QuerySet[<Person:Person object(1)>, <Person:Person object(2)>]>
>> Person.objects.filter(name='sue')

Delete(삭제)

delete 

1) filter나 get으로 row 읽어옴.

2) 삭제 적용

>> from person.models import Person
>> Person.objects.filter(age=1000)
>> <QuerySet[<Person:Person object(1)>, <Person:Person object(2)>]>
>> Person.objects.delete(name='sue')

3. _set 역참조 매니저 사용하기

A 테이블의 한 row를 참조하는 모든 B 테이블의 row를 읽어올 때 사용.

 

예를 들어 Question, Choice 테이블이 있다고 가정해보자.

Question, Choice는 일대다 관계이다. (한 질문은 여러 선택지를 가질 수 있음. 한 선택지는 한 질문에만 속함)

 

<models.py>

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    def __str__(self):
        return self.question_text


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    def __str__(self):
        return self.choice_text

python3 manage.py shell 실행

1번 question이 갖는 모든 choice를 읽어올 때 _set을 사용한다.

Question.objects.get(id=1).choice_set.all()

+ 어드민

데이터를 입력/수정할 수 있게 django에 내장된 인터페이스.

 

1) 어드민 유저 등록

python3 manage.py createsuperuser

2) admin.py에 모델 등록

from django.contrib import admin
from .models import Users, Posts

# 기본형
admin.site.register(Posts)

# 커스터마이징
class UserAdmin(admin.ModelAdmin):
   list_display = ("id", "name")

admin.site.register(Users, UserAdmin)

3) 서버 실행 후 url 끝에 /admin 붙이면 어드민 화면으로 이동

 

 

참고

Django ORM

Introduction to the Django ORM