Django之ORM相關操做

通常操做

經常使用的13個操做

<1> all():                 查詢全部結果
 
<2> filter(**kwargs):      它包含了與所給篩選條件相匹配的對象
 
<3> get(**kwargs):         返回與所給篩選條件相匹配的對象,返回結果有且只有一個,若是符合篩選條件的對象超過一個或者沒有都會拋出錯誤。
 
<4> exclude(**kwargs):     它包含了與所給篩選條件不匹配的對象
 
<5> values(*field):        返回一個ValueQuerySet——一個特殊的QuerySet,運行後獲得的並非一系列model的實例化對象,而是一個可迭代的字典序列
 
<6> values_list(*field):   它與values()很是類似,它返回的是一個元組序列,values返回的是一個字典序列
 
<7> order_by(*field):      對查詢結果排序
 
<8> reverse():             對查詢結果反向排序,請注意reverse()一般只能在具備已定義順序的QuerySet上調用(在model類的Meta中指定ordering或調用order_by()方法)。
 
<9> distinct():            從返回結果中剔除重複紀錄(若是你查詢跨越多個表,可能在計算QuerySet時獲得重複的結果。此時可使用distinct(),注意只有在PostgreSQL中支持按字段去重。)
 
<10> count():              返回數據庫中匹配查詢(QuerySet)的對象數量。
 
<11> first():              返回第一條記錄
 
<12> last():               返回最後一條記錄
 
<13> exists():             若是QuerySet包含數據,就返回True,不然返回False

返回QuerySet對象的方法有

all()

filter()

exclude()

order_by()

reverse()

distinct()

特殊的QuerySet

values()         返回一個可迭代的字典序列

values_list()    返回一個可迭代的元祖序列

返回具體的對象

get()
first()
last()

返回布爾值

exists()

返回數字

count()

 單表查詢經常使用操做

gt - Greater than

大於數據庫

 例: django

models.Person.objects.filter(id__gt=4)    # 獲取id大於4的值

對應的SQL語句:spa

SELECT ... WHERE id > 4;

gte - Greater than or equal to

大於或等於code

lt - Less than

小於對象

lte - Less than or equal to

小於或等於blog

例: 得到id大於2且小於5的值排序

models.Person.objects.filter(id__gt=2, id__lt=5)

 in

給定的是可迭代的, 一般是列表, 元組或者queryset.rem

例:文檔

models.Person.objects.filter(id__in=[1, 3])    # 獲取id等於1, 3的數據

對應的SQL語句:get

SELECT ... WHERE id IN (1, 3);

contains

區分大小寫

例:

models.Person.objects.filter(name__contains='a')    # 獲取name字段中包含"a"的數據

對應的SQL語句:

SELECT ... WHERE name LIKE '%a%';

icontains

不區分大小寫

例:

models.Person.objects.filter(name__contains='a')    # 獲取name字段中包含"a"或者"A"的數據

對應的SQL語句:

SELECT ... WHERE name ILIKE '%a%';

range

包括兩邊的邊界值

例:

models.Person.objects.filter(id__range=[1, 3])    # id範圍是1到3

對應的SQL語句:

SELECT ... WHERE id BETWEEN 1 and 3;

startswith

以...開頭, 區分大小寫

例:

models.Person.objects.filter(name__startswith='a')

對應的SQL語句:

SELECT ... WHERE name LIKE 'a%';

相似的:

istartswith

以...開頭, 不區分大小寫

endswith

以...結尾, 區分大小寫

iendswith

以...結尾, 不區分大小寫


year

例:

models.Person.objects.filter(birth__year=2019)

對應的SQL語句:

SELECT ... WHERE birth BETWEEN '2019-01-01' AND '2019-12-31';

 ForeignKey操做

正向查找

對象查找(跨表)

語法: 

對象.關聯字段.字段

例:

book_obj = models.Book.objects.first()  # 第一本書對象
print(book_obj.press)  # 獲得這本書關聯的出版社對象
print(book_obj.press.name)  # 獲得出版社對象的名稱

字段查找(跨表)

語法:

關聯字段__字段

例:

print(models.Book.objects.values('press__name'))
obj = models.Book.objects.filter(press__name='xx出版社')
print(obj)

反向查找

對象查找

語法:

默認:
obj.表名_set

表名_set能夠本身命名

例:

press_obj = models.Press.objects.first()    # 找到第一個出版社對象
books = press_obj.books.all()    # 找到第一個出版社出版的全部書
titles = books.values_list('title')    # 找到第一個出版社出版的全部書的書名
print(books)
print(titles)

字段查找

語法:

表名__字段

例:

titles = models.Press.objects.values_list('books__title')
# books__title中的books是本身在models.py中, related_name='books'
# 具體的代碼:
class Book(models.Model):
    title = models.CharField(max_length=32)
    press = models.ForeignKey(to='Press', on_delete=models.CASCADE, related_name='books')

ManyToManyField

class RelatedManager

"關聯管理器"是在一對多或者多對多的關聯上下文中使用的管理器。

它存在於下面兩種狀況:

  1. 外鍵關係的反向查詢
  2. 多對多關聯關係

簡單來講就是當 點 後面的對象 可能存在多個的時候就可使用如下的方法。

方法

create()

建立一個新的對象,保存對象,並將它添加到關聯對象集之中,返回新建立的對象。

obj = models.Author.objects.first()
obj.books.create(title='一塊兒來學MATLAB', press_id=2)

add()

把指定的model對象添加到關聯對象集中。

添加對象

obj = models.Author.objects.first()
obj.books.add(*models.Book.objects.all())

添加id

obj = models.Author.objects.first()
obj.books.add(*[3, 4])

set()

更新model對象的關聯對象

obj = models.Author.objects.first()
obj.books.set([1, 2])

remove()

從關聯對象集中移除執行的model對象

obj = models.Author.objects.first()
obj.books.remove(1)

clear()

從關聯對象集中移除一切對象

obj = models.Author.objects.first()
obj.books.clear()

注意:

對於ForeignKey對象,clear() 和 remove() 方法僅在 null=True 時存在。

 

 

 

詳情見 Django官方文檔

相關文章
相關標籤/搜索