Django의 Q 쿼리 및 Q() 객체 F 쿼리 및 F() 객체
3731 단어 Django
#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()는 다음과 같은 방법으로 성능 우위를 제공할 수 있다.
만약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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.