當一般的查詢語句已經無法滿足我們的需求時,django為我們提供了f和q複雜查詢語句。假設場景一:老闆說對資料庫中所有的商品,在原**的基礎**價10元,你該怎麼做?場景二:我要查詢乙個名字叫***,年齡是18歲,或者名字是yyy,年齡是是19歲的人,你該怎麼寫你的orm語句?
一、f查詢
1
2
3
4
from
django.db.models
import
f
from
import
book
book.objects.update(price
=
f(
"price"
)
+
20
)
# 對於book表中每本書的**都在原**的基礎上增加20元
就這樣一條簡單的語句就完成了對錶中所有商品**的更新,是不是很方便!如果沒有f查詢,你首先要獲取原**,再做乙個算術運算,然後更新字段。f查詢專門對物件中某列值的操作,不可使用__雙下劃線!
二、q查詢
q查詢可以組合使用 「&」, 「|」 操作符,當乙個操作符是用於兩個q的物件,它產生乙個新的q物件,q物件可以用 「~」 操作符放在前面表示否定,也可允許否定與不否定形式的組合。q物件可以與關鍵字引數查詢一起使用,不過一定要把q物件放在關鍵字引數查詢的前面。
1
2
3
4
5
6
7
from
django.db.models
import
q
print
(book.objects.
filter
(q(
id
=
3
))[
0
])
# 因為獲取的結果是乙個queryset,所以使用下標的方式獲取結果
print
(book.objects.
filter
(q(
id
=
3
)|q(title
=
"go"
))[
0
])
# 查詢id=3或者標題是「go」的書
print
(book.objects.
filter
(q(price__gte
=
70
)&q(title__startswith
=
"j"
)))
# 查詢**大於等於70並且標題是「j」開頭的書
print
(book.objects.
filter
(q(title__startswith
=
"j"
) & ~q(
id
=
3
)))
# 查詢標題是「j」開頭並且id不是3的書
print
(book.objects.
filter
(q(price
=
70
)|q(title
=
"python"
), publication_date
=
"2017-09-26"
))
# q物件可以與關鍵字引數查詢一起使用,必須把普通關鍵字查詢放到q物件查詢的後面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from
django.db.models
import
q
con
=
q()
q1
=
q()
q1.connector
=
"and"
"email"
,
"[email protected]"
))
"password"
,
"abc123"
))
q2
=
q()
q2.connector
=
"and"
"username"
,
"abc"
))
"password"
,
"xyz123"
))
con.add(q1,
"or"
)
con.add(q2,
"or"
)
obj
=
models.userinfo.objects.
filter
(con).first()
# 查詢[email protected]和password=abc123 或者 username=abc和password=xyz123的使用者資訊
上面的例子就是乙個典型的複雜查詢,通過將q物件例項化來然後增加各個條件之間的關係,而且這種寫法用在你不知道使用者到底會傳入多少個引數的時候很方便!
daibaiyang119
Django之F和Q查詢
當一般的查詢語句已經無法滿足我們的需求時,django為我們提供了f和q複雜查詢語句。假設場景一 老闆說對資料庫中所有的商品,在原 的基礎 價10元,你該怎麼做?場景二 我要查詢乙個名字叫 年齡是18歲,或者名字是yyy,年齡是是19歲的人,你該怎麼寫你的orm語句?一 f查詢 1 2 3 4 fr...
Django之F與Q查詢
from django.db.models import f,q 1.查詢庫存數大於賣出數的書籍 res models.book.objects.filter kucun gt f maichu print res 2.將所有書的 提高100 models.book.objects.update p...
Django框架F查詢與Q查詢 全面了解
一 f與q查詢 1.f查詢的作用 能夠幫助你直接獲取到列表中某個字段對應的資料 注意 在操作字串型別的資料的時候,f不能夠直接做到字串的拼接 2.查詢賣出書大於庫存數的書籍 匯入f查詢 from django.db.models import f f 將書籍 庫存字段對應的值 依序取出 並進行比較 ...