사용자 지정 Django 데이터베이스 함수 작성

Django의 데이터베이스 기능은 데이터베이스에서 실행될 기능을 나타냅니다. 사용자가 기본 데이터베이스에서 제공하는 기능을 주석, 집계 또는 필터로 사용할 수 있는 방법을 제공합니다. 함수도 expressions 이므로 aggregate functions 과 같은 다른 표현과 결합하여 사용할 수 있습니다.

풍부한 Django의 기능 중 하나는 다양한 기능의 사용자 정의를 포함합니다. 네, 맞습니다! 🙌 필요에 따라 Django 데이터베이스 기능을 사용자 정의할 수 있습니다.

📝 이 게시물에서는 비즈니스 요구 사항에 따라 사용자 지정 함수를 작성하는 요령을 얻기 위해 아래 몇 가지 예를 살펴보겠습니다.

👉 먼저 우리가 앞으로 나아가기 위한 기반이 되는 Django Func() 클래스를 이해합시다.

📜 Django Func(*expressions, **extra) 클래스


  • 클래스Func()Django Query Expressions의 가장 일반적인 부분입니다.
  • 거의 모든 함수 또는 연산자를 어떤 식으로든 Django ORM에 구현할 수 있습니다
  • .

  • Func() expressionCOALESCELOWER와 같은 데이터베이스 함수 또는 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 함수를 만들 수 있습니다. 출처: StackOverflow

    from 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()
    



    📑 리소스


  • Django database functions
  • Django Func() class
  • StackOverflow answer GROUP BY without aggregate



  • 안녕! 다음 포스팅까지 😋

    좋은 웹페이지 즐겨찾기