본문 바로가기
python/Django

Django Database Functions - Comparison and conversion

by Redking

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}

 

댓글