(6) Django 진급길QuerySet에서

from django.db.models import Count, F, Value
from django.db.models.functions import Length, Upper

F 표현식의 일반 사용
#            。
Company.objects.filter(num_employees__gt=F('num_chairs'))

#               ,                 。
Company.objects.filter(num_employees__gt=F('num_chairs') * 2)
Company.objects.filter(
    num_employees__gt=F('num_chairs') + F('num_chairs'))

F 표현식의 조합 사용
#                    ?
>>> company = Company.objects.filter(
...    num_employees__gt=F('num_chairs')).annotate(
...    chairs_needed=F('num_employees') - F('num_chairs')).first()
>>> company.num_employees
120
>>> company.num_chairs
50
>>> company.chairs_needed
70

Upper 표현식 사용
#    Upper             。
>>> company = Company.objects.create(name='Google', ticker=Upper(Value('goog')))
#         ,      。
>>> company.refresh_from_db()
>>> company.ticker
'GOOG'

집합과 F의 조합 사용
  • Annotate 모형 방법과 집합 방법인aggregated에서 나온 값으로 새로운 필드 별명을 구성하는데 다음과 같은 두 단락의 코드가 같은 효과가 있다
  • Company.objects.annotate(num_products=Count('products'))
    Company.objects.annotate(num_products=Count(F('products')))
    
  • Aggregates는 복잡한 계산도 포함할 수 있다
  • 
    Company.objects.annotate(num_offerings=Count(F('products') + F('services')))
    
  • 표현식도orderby()에서 사용
  • Company.objects.order_by(Length('name').asc())
    Company.objects.order_by(Length('name').desc())
    
  • 밑줄을 사용하여 구문을 찾습니다.
  • from django.db.models import CharField
    from django.db.models.functions import Length
    CharField.register_lookup(Length)
    Company.objects.order_by('name__length')
    

    F 표현식의 일부 이론
  • 여기서 우리는 리포트의 값을 끌어냈다.stories_field는 데이터베이스에서 메모리로 들어가 익숙한 Python 조작부호를 사용하여 이를 조작한 후 대상을 데이터베이스에 저장합니다.남성복 잡지 새로운 뉴스 보도
  • reporter = Reporters.objects.get(name='   ')
    reporter.stories_filed += 1
    reporter.save()
    
  • 리포트를 통해.stories_filed = F('stories filed') + 1은 일반적인 Python이 실례 속성에 값을 부여하는 것처럼 보이지만 실제로는 데이터베이스 조작을 설명하는 SQL 구조이다.
  • Django가 F()의 실례를 만났을 때 표준 Python 조작부호를 덮어쓰고 봉인된 SQL 표현식을 만듭니다.이 예에서는 데이터베이스에 리포트를 추가하도록 지시합니다.stories_field가 표시하는 데이터베이스 필드입니다.
  • 리포트를 상관하지 않는다.stories_filed의 값이 무엇입니까?파이톤은 완전히 데이터베이스에서 처리된다는 것을 영원히 알 수 없다.Python이 Django의 F () 클래스를 통해 하는 일은 SQL 문법을 만들어서 필드를 인용하고 동작을 설명하는 것입니다.
  • from django.db.models import F
    
    reporter = Reporters.objects.get(name='Tintin')
    reporter.stories_filed = F('stories_filed') + 1
    reporter.save()
    
  • 이렇게 저장된 새 값에 접근하려면 대상을 다시 불러와야 합니다
  • #     
    reporter = Reporters.objects.get(pk=reporter.pk)
    #           
    reporter.refresh_from_db()
    
  • 위의 단일 실례에서의 작업 외에 대상 실례의 조회 집합에서 F()를 사용하고 업데이트()를 사용할 수 있다.이것은 위에서 사용한 두 개의 검색어인 get()과save()를 하나
  • 로 감소시킵니다.
    reporter = Reporters.objects.filter(name='Tintin')
    reporter.update(stories_filed=F('stories_filed') + 1)
    
  • 우리는 업데이트()를 사용하여 여러 대상의 필드 값을 증가시킬 수 있다. 이것은 데이터베이스에서 모두 파이톤에 넣고 옮겨다니며 각 대상의 필드 값을 증가시켜 각 대상을 데이터베이스에 저장하는 것보다 훨씬 빠르다
  • Reporter.objects.all().update(stories_filed=F('stories_filed') + 1)
    

    좋은 웹페이지 즐겨찾기