Django의 Q 쿼리 및 Q() 객체 F 쿼리 및 F() 객체

3731 단어 Django
문서 목록
  • Django Q/F
  • #1 환경
  • #2 시작
  • #2.1 django F() 표현식
  • #2.2 F ()는 obj에서 작동합니다.save() 후 지속 가능
  • #2.3 F() 재필터(filter)에서의 사용
  • #2.4 Django Q() 표현식
  • #2.5Q() 수신 조건 조회
  • #2.6 Q() 비
  • Django Q/F
    #1 환경
    Python3.7.3
    Django==2.0.6
    

    #2 시작
    #2.1 django F() 표현식
    매번 타임즈의 현재 값을 가져올 때마다 +1을 더하면 타임즈 값을 꺼내 메모리에 저장해야 합니다
    obj = models.Test.objects.get(name="cox")
    obj.times = obj.times + 1
    obj.save()
    

    비록times = F ("times") + 1 은 일반적인 Python처럼 실례 속성에 값을 부여하지만, 실제로는 데이터베이스에서 작업하는 SQL 구조를 설명합니다
    Django가 F () 실례를 만났을 때, 표준 Python 연산자를 덮어쓰고 봉인된 SQL 표현식을 만들 것입니다.이 예에서 지시 데이터베이스 증가는obj.times가 표시하는 데이터베이스 필드입니다.obj를 막론하고.times의 값이 무엇인지, 파이톤은 영원히 알 필요가 없다. 완전히 데이터베이스에서 처리된다.Python이 Django의 F () 클래스를 통해 하는 모든 일은 한 필드를 참고하여 SQL 문법을 만드는 것입니다.
    obj = models.Test.objects.get(name="cox")
    obj.times = F("times") + 1
    obj.save()
    

    따라서 F()는 다음과 같은 방법으로 성능 우위를 제공할 수 있다.
  • python
  • 이 아닌 데이터베이스에서 직접 조작
  • 일부 작업에 필요한 데이터베이스 조회 횟수 감소
  • #2.2 F ()는 obj에서 작동합니다.save () 이후 계속 존재
    만약times의 값이 1이라면 n회save()를 거친 후에times의 값은 2이다
    obj = models.Test.objects.get(name="cox")
    obj.times = obj.times + 1
    obj.save()
    obj.save()
    obj.save()
    

    만약times의 값이 1이라면 n회save()를 거친 후에times의 값은 1+n이지 2가 아니다. 바로 F()가 obj에서 조작되기 때문이다.save () 이후 계속 존재
    obj = models.Test.objects.get(name="cox")
    obj.times = F("times") + 1
    obj.save()
    obj.save()
    obj.save()
    

    #2.3 F() 재필터(filter) 사용
    테이블의 수입(input price)이 지출(output price)보다 큰 데이터 가져오기
    models.Test.objects.filter(input_price__gt=F("output_price"))
    

    Django는 플러스, 마이너스, 곱하기, 나누기, 추출 및 멱 연산 등의 산술 작업을 지원하며 두 작업 수는 상수 또는 F() 객체일 수 있습니다.
    models.Test.objects.filter(input_price__gt=F("output_price")*2)
    
    models.Test.objects.filter(input_price__gt=F("output_price")+F("output_price"))
    

    F() 객체에 이중 밑줄 표시를 사용하여 연관 관계를 뛰어넘을 수도 있습니다.밑줄이 두 개인 F() 객체는 연관된 객체에 액세스하기 위해 필요한join 작업을 가져옵니다.
    models.Test.objects.filter(authors__name=F('blog__name'))
    

    date와date/time 필드에 timedelta 대상을 추가하거나 줄일 수 있습니다
    from datetime import timedelta
    models.Test.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3))
    

    #2.4 Django Q() 표현식
    질의의 기준에서 조건을 조합해야 하는 경우(예: 두 조건 "및"또는 "또는")우리는 Q()를 사용하여 대상을 조회할 수 있다
    from django.db.models import Q
    models.Author.objects.filter(Q(name="cox") | Q(name="Tom")) #    Author  ,name  cox name  cox     
    
    models.Author.objects.filter(Q(name="cox") & Q(age=12))#    Author  ,name  cox  age  12     
    

    #2.5 Q() 수신 조건 조회
    q1 = Q()
    q1.connector = 'OR'
    q1.children.append(('name', "cox"))
    q1.children.append(('name', "Tom"))
    q1.children.append(('name', "Jeck"))
        
    models.Author.objects.filter(q1) #  Author  ,name  cox/Tom/Jeck     
    
    con = Q()
    
    q1 = Q()
    q1.connector = 'OR'
    q1.children.append(('name', "cox"))
    q1.children.append(('name', "Tom"))
    q1.children.append(('name', "Jeck"))
    
    q2 = Q()
    q2.connector = 'OR'
    q2.children.append(('age', 12))
    
    con.add(q1, 'AND')
    con.add(q2, 'AND')
    
    models.Author.objects.filter(con) #  Author  ,name  cox/Tom/Jeck       age  12      
    

    #2.6 Q() not
    Q()문에서 ~는 no를 나타냅니다.
    models.Author.objects.filter(~Q(name="cox")) #    Author  ,name   cox     
    

    좋은 웹페이지 즐겨찾기