사용자 지정 Django 데이터베이스 함수 작성
풍부한 Django의 기능 중 하나는 다양한 기능의 사용자 정의를 포함합니다. 네, 맞습니다! 🙌 필요에 따라 Django 데이터베이스 기능을 사용자 정의할 수 있습니다.
📝 이 게시물에서는 비즈니스 요구 사항에 따라 사용자 지정 함수를 작성하는 요령을 얻기 위해 아래 몇 가지 예를 살펴보겠습니다.
👉 먼저 우리가 앞으로 나아가기 위한 기반이 되는
Django Func()
클래스를 이해합시다.📜 Django Func(*expressions, **extra) 클래스
Django Query Expressions
의 가장 일반적인 부분입니다.Django ORM
에 구현할 수 있습니다Func() expression은
COALESCE
및 LOWER
와 같은 데이터베이스 함수 또는 SUM
와 같은 집계를 포함하는 모든 표현식의 기본 유형입니다.Func()
를 사용하기 전에 Avoiding SQL injection을 읽어 보시기 바랍니다.다음은 사용자 지정 데이터베이스 함수를 작성하는 몇 가지 방법입니다.
🔹 사용자 지정 데이터베이스 기능
DjangoFunc class를 사용하여 사용자 정의 데이터베이스 기능을 생성할 수 있습니다. 내 프로젝트 중 하나에서 특정 날짜 형식을 사용하여 Django 필터에서
UTC
타임스탬프를 IST
로 변환하고 싶었습니다. 두 개의 간단한 Django 데이터베이스 함수를 작성하면 다음과 같이 여러 인스턴스에서 도움이 되었습니다reuse
.from django.db.models import Func
class TimestampToIST(Func):
""" Converts the db (UTC) timestamp value to IST equivalent timestamp
"""
function = 'timezone'
template = "%(function)s('Asia/Calcutta', %(expressions)s)"
class TimestampToStr(Func):
""" Converts the timestamp to string using the given format
"""
function = 'to_char'
template = "%(function)s(%(expressions)s, 'DD/MM/YYYY HH24:MI:SS')" # 21/06/2021 16:08:34
# Usage
Author.objects.annotate(last_updated=TimestampToStr(TimestampToIST(F('updated_at'))))
🔹 데이터베이스 기능의 부분 구현
또 다른 훌륭한 사용자 지정 예제는 하나 또는 두 개의 인수가 이미 채워진 새 버전의 함수를 만드는 것입니다. 예를 들어 문자열에서 첫 번째 문자를 추출하는 특수
SubStr
를 만들어 보겠습니다.from functools import partial
from django.db.models.functions import Substr
ExtractFirstChar = partial(Substr, pos=1, length=1)
# Usage
User.objects.annotate(name_initial=ExtractFirstChar('first_name'))
🔹 집계 함수 없이 GROUP BY 실행
집계 함수를 사용하지 않고
GROUP BY
를 사용하려는 상황을 상상해 보십시오. Django ORM
는 집계 함수 없이 GROUP BY
를 사용할 수 없습니다. 따라서 이를 달성하기 위해 Django에서 집계 함수로 처리되지만 NULL
에서 SQL query
로 평가되는 Django 함수를 만들 수 있습니다. 출처: StackOverflowfrom django.db.models import CharField, Func
class NullAgg(Func):
"""Annotation that causes GROUP BY without aggregating.
A fake aggregate Func class that can be used in an annotation to cause
a query to perform a GROUP BY without also performing an aggregate
operation that would require the server to enumerate all rows in every
group.
Takes no constructor arguments and produces a value of NULL.
Example:
ContentType.objects.values('app_label').annotate(na=NullAgg())
"""
template = 'NULL'
contains_aggregate = True
window_compatible = False
arity = 0
output_field = CharField()
📑 리소스
안녕! 다음 포스팅까지 😋
Reference
이 문제에 관하여(사용자 지정 Django 데이터베이스 함수 작성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/idrisrampurawala/writing-custom-django-database-functions-4dmb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)