오늘도 개발
Django와 데이터베이스 - 3) Django QuerySet API 본문
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 붙이면 어드민 화면으로 이동
참고
Introduction to the Django ORM