[Django] Model Query
지난 글에서는 Greeting 이라는 model 을 정의하고 migration 을 통해 database 에 model 을 적용해보았다. 이번 글에서는 django 에서 제공해주는 API 를 사용하여 model 객체를 생성하고 수정, 삭제하는 방법을 정리해본다.
1. Manager
django model 을 사용하여 query 를 작성하기 전에 manager 라는 개념에 대해서 먼저 알아보자. manager 는 django model 에 database query 작업을 제공해주는 인터페이스로 django app 에 포함된 모든 model 들은 최소 하나의 manager 를 가지고 있다.
model 클래스가 가지고 있는 manager 는 기본적으로 objects 라는 이름을 가진다. 해당 model 과 관련된 query 를 작성하기 위해서는 아래의 예제와 같이 objects 를 호출하여 작업을 수행할 수 있다.
Greeting.objects.all() # Greeting 테이블의 모든 data 를 select 하는 명령어
objects 가 아닌 다른 이름을 사용하고 싶다면 model 클래스에 models.Manager() 객체를 직접 정의해주어 사용할 수 있다.
from django.db import models
class Greeing(models.Model):
greeting_manager = models.Manager()
manager 의 기능을 커스텀하는 것도 가능한다. models.Manager 를 상속받은 클래스에 원하는 메서드를 추가하여 커스텀 manager 클래스를 구현할 수 있다.
from django.db import models
class CustomManager(models.Manager):
def not_deleted(self):
return self.filter(is_deleted=False)
class TestModel(models.Model):
objects = CustomManager()
# ...
예제와 같이 CustomManager 객체를 model manager 로 사용하는 경우 기본 manager 의 인터페이스 외에도 not_deleted 라는 기능을 추가하여 사용할 수 있다.
manager 를 커스텀할 때 새로운 인터페이스를 추가하는 것이 아니라 기본 manager 에서 제공해주는 기능을 오버라이딩 하는 것도 가능하다. manager 에서 기본적으로 제공해주는 queryset 기능을 오버라이딩 할 수 있는데, 이러한 기본 인터페이스를 오버라이딩 하는 경우에는 쿼리 작업에 문제가 생기지 않도록 조심하며 개발해야한다.
2. Query 작성
model manager 를 사용하여 데이터를 생성, 수정, 삭제하는 등의 쿼리를 작성할 수 있다. 기본적인 쿼리 인터페이스와 이를 사용하는 예제를 통해 정리해본다.
- create object
객체를 생성하는 방법은 두가지가 있다. model 클래스의 생성자를 통해 생성된 객체를 save() 하는 방법과 create() 메서드를 통해 객체를 생성하는 방법이 있다.
# save
greeting = Greeting(country="KR", greeting="안녕하세요")
greeting.save()
# create
Greeting.objects.create(country="US", greeting="Hello")
save() 는 생성된 객체를 database 에 저장하는 메서드이다. 객체 생성과 저장을 한번에 하기 위해서는 create() 를 사용하면 된다.
- update object
객체의 값을 변경하기 위해서는 객체의 필드 값을 변경해준 뒤 save() 를 호출하면 된다.
hello = Greeting.objects.get(country="US")
hello.greeting = "Hi"
hello.save()
- retrieve object
객체를 조회하기 위해서는 manager 를 이용해 QuerySet 을 구성해야 한다. QuerySet 은 database 에서 주는데, database 의 SELECT 문을 생각하면 된다. SELECT 문을 사용할 때 WHERE 절에 여러 조건들이나 ORDER BY, LIMIT 등의 기능을 추가해서 사용하는 것과 같이 QuerySet 도 여러 함수들을 chaining 하여 조회 조건을 구성할 수 있다.
대표적인 메서드들로는 조건에 맞는 모든 객체를 조회하는 all(), 하나의 객체만 조회하는 get(), WHERE 절과 같이 조건을 추가한 QuerySet 을 반환하는 filter() 등이 있다.
# all
Greeting.objects.all()
# get
Greeting.objects.get(country="KR")
# filter
Greeting.objects.filter(greeting="Hello").all()
이외에도 exclude(), order_by(), limit() 등 검색을 위한 여러 기능을 가지고 있는데, 자세한 내용은 django 공식 문서에 잘 정리되어 있다. (https://docs.djangoproject.com/en/6.0/topics/db/queries/#retrieving-objects)
- delete object
객체를 삭제할 때는 delete() 메서드를 사용하면 된다. 아래의 예제와 같이 단건과 다건 모든 경우에 사용할 수 있다.
# delete
hello = Greeting.objects.get(country="US")
hello.delete()
# delete all
Greeting.objects.all().delete()
[References]
- https://docs.djangoproject.com/en/6.0/topics/db/queries/
Making queries | Django documentation
The web framework for perfectionists with deadlines.
docs.djangoproject.com
- https://docs.djangoproject.com/en/6.0/topics/db/managers/#django.db.models.Manager
Managers | Django documentation
The web framework for perfectionists with deadlines.
docs.djangoproject.com