본문 바로가기
python/Django

Django Database Functions - Text functions

by Redking

Django ORM은 데이터베이스 기능을 지원하기 위해 functions를 제공하고 있습니다. 이번 글에서는 텍스트 functions들에 대해 알아보도록 하겠습니다. 

Chr,  Ord

Chr, Ord함수는 파이썬의 chr()와 ord()함수와 동일하게 동작합니다. numeric field 또는 expression을 리턴합니다. 

from django.db.models.functions import Chr, Ord

Author.objects.create(name='Margaret Smith')
author = Author.objects.filter(name__startswith=Chr(ord('M'))).get()
print(author.name)
# Margaret Smith

author = Author.objects.annotate(name_code_point=Ord('name')).get()
print(author.name_code_point)
# 77

Concat

Concat은 두 개 이상의 텍스트 필드 또는 expression 목록을 사용 가능하고 연결된 텍스트를 반환합니다. 각 인수는 텍스트 또는 문자 유형이어야 합니다. TextField()를 CharField()와 연결하려면 Cast를 사용해 유형을 변경하거나 아래 예제와 같이 값을 연결할 때도 output_field를 지정해야 합니다.
# Get the display name as "name (goes_by)"
from django.db.models import CharField, Value as V
from django.db.models.functions import Concat
Author.objects.create(name='Margaret Smith', goes_by='Maggie')
author = Author.objects.annotate(
    screen_name=Concat(
        'name', V(' ('), 'goes_by', V(')'),
        output_field=CharField()
	)
).get()
print(author.screen_name)
# Margaret Smith (Maggie)

Left, Right

Left는 주어진 텍스트 필드 또는 expression의 첫 번째 문자를 반환합니다. 

Right는 주어진 텍스트 필드 또는 expression의 마지막 문자를 반환합니다.

from django.db.models.functions import Left
Author.objects.create(name='Margaret Smith')
author = Author.objects.annotate(first_initial=Left('name', 1)).get()
print(author.first_initial)
# M

Length

Length는 주어진 텍스트 필드 또는 expression의 문자 수를 반환합니다.

# Get the length of the name and goes_by fields
from django.db.models.functions import Length
Author.objects.create(name='Margaret Smith')
author = Author.objects.annotate(
    name_length=Length('name'),
    goes_by_length=Length('goes_by')
).get()
print(author.name_length, author.goes_by_length)
# (14, None)

Lower, Upper

Lower는 주어진 텍스트 필드 또는 expression을 소문자로 반환합니다.

Upper는 주어진 텍스트 필드 또는 expression을 대문자로 반환합니다.

from django.db.models.functions import Lower
Author.objects.create(name='Margaret Smith')
author = Author.objects.annotate(name_lower=Lower('name')).get()
print(author.name_lower)
# margaret smith

LPad, RPad

LPad는 텍스트 좌측에 원하는 길이로 지정된 텍스트 값을 채워 값을 반환합니다. 
RPad도 존재하며 텍스트 우측에 적용됩니다.

from django.db.models import Value
from django.db.models.functions import LPad
Author.objects.create(name='John', alias='j')
Author.objects.update(name=LPad('name', 12, Value('123')))
# 1
print(Author.objects.get(alias='j').name)
# 12312312John

Trim

Trim은 선행 및 후행 공백이 제거된 지정된 텍스트 필드 또는 expression의 값을 반환합니다.

from django.db.models.functions import Trim
Author.objects.create(name='  John  ', alias='j')
Author.objects.update(name=Trim('name'))
# 1
print(Author.objects.get(alias='j').name)
# John
 

LTrim, RTrim

LTrim은 Trim과 유사하지만 선행된 공백만 제거합니다.
RTrim도 존재하며 LTrim의 반대로 후행된 공백만 제거합니다.

Repeat

Repeat은 지정된 텍스트 필드 또는 expression을 반복하는 값을 반환합니다.

from django.db.models.functions import Repeat
Author.objects.create(name='John', alias='j')
Author.objects.update(name=Repeat('name', 3))
# 1
print(Author.objects.get(alias='j').name)
JohnJohnJohn

Replace

Replace는 원하는 모든 텍스트를 대체합니다. 인자는 대소문자를 구분합니다.

from django.db.models import Value
from django.db.models.functions import Replace
Author.objects.create(name='Margaret Johnson')
Author.objects.create(name='Margaret Smith')
Author.objects.update(name=Replace('name', Value('Margaret'), Value('Margareth')))
# 2
Author.objects.values('name')
# <QuerySet [{'name': 'Margareth Johnson'}, {'name': 'Margareth Smith'}]>

Reverse

Reverse는 주어진 모든 텍스트를 역순으로 반환합니다.

from django.db.models.functions import Reverse
Author.objects.create(name='Margaret Smith')
author = Author.objects.annotate(backward=Reverse('name')).get()
print(author.backward)
# htimS teragraM

댓글