Django ORM은 데이터베이스 기능을 지원하기 위해 functions를 제공하고 있습니다. 이번 글에서는 비교 및 변환 functions들에 대해 알아보도록 하겠습니다.
Cast
Cast는 값의 필드 타입을 output_field의 필트 타입이 되도록 변경시키는 역할을 합니다.
이를 사용하려면 expression, output_field 2개의 인자를 Cast function에 넣어줘야 하고 두가지 모두 유효한 값이여야 합니다.
from django.db.models.functions import Cast, FloatField
Sample.objects.annotate(
float_num=Cast('number', output_field=FloatField())
)
위 코드가 실행되면 float_num의 타입은 float로 변환됩니다.
Coalesce
Coalesce는 2가지 이상의 표현식을 인자로 사용할 수 이고 이중 null이 아닌 첫번째 값을 반환 합니다. 각 인수는 유사한 유형으로 작성해야 하고 가능다면 Cast를 사용해 같은 유형으로 변환시켜 사용하는게 좋습니다.
from django.db.models.functions import Coalesce
Sample.objects.annotate(
percent=Coalesce('percent', 0.0)
)
'percent'가 null이라면 0.0을 반환하고 null이 아니라면 'percent'의 값을 반환합니다.
Collate
Collate는 대소문자를 구분하지 않고 필터링 할 때 사용하거나 정렬할때 사용할 수 있습니다.
from django.db.models.functions import Collate
Sample.objects.filter(name=Collate('Kim'))
>>> <QuerySet [<Person: Kim>, <Person: kim>]>
Sample.objects.order_by(Collate('name', 'et-x-icu'))
>>> <QuerySet [<Person: Ursula>, <Person: Veronika>, <Person: Ülle>]>
정렬에 사용하는 경우에는 postgresql의 기능과 같이 사용이 가능합니다. 링크 참조
Greatest
Greatest는 두개 이상의 표현식중에 더욱 큰 값을 반환합니다. 각 인수는 유사한 타입이여야 하므로 가능하면 Cast를 이용해 타입을 일치시키는게 좋습니다.
from django.db.models.functions import Greatest
Sample.objects.annotate(Greatest('created', 'updated'))
이렇게 2가지 값이 있을때 더욱 큰 값이 반환됩니다.
Least
Least는 두개 이상의 표현식중에 더욱 작은 값을 반환합니다. 각 인수는 유사한 타입이여야 하므로 가능하면 Cast를 이용해 타입을 일치시키는게 좋습니다.
from django.db.models.functions import Least
Sample.objects.annotate(Least('created', 'updated'))
이렇게 2가지 값이 있을때 더욱 작은 값이 반환됩니다.
JSONObject
JSONObject는 key와 value쌍을 가져와 JSON객체로 반환합니다.
from django.db.models import F
from django.db.models.functions import JSONObject, Lower
a = Person.objects.annotate(json_object=JSONObject(
name=Lower('name'),
alias='alias',
age=F('age') * 2,
)).get()
>>> a.json_object
{'name': 'margaret smith', 'alias': 'msmith', 'age': 50}
'python > Django' 카테고리의 다른 글
Django csv streaminghttpresponse (0) | 2022.08.31 |
---|---|
Django Database Functions - Date functions (0) | 2022.06.08 |
Django 커스텀 커맨드 만들기 (1) | 2021.12.04 |
Django의 Meta 클래스 사용법 [ordering, db_table, verbose_name, etc] (0) | 2021.12.03 |
Django의 channel로 만드는 간단한 채팅 앱 (0) | 2021.12.03 |
댓글