Django查詢及雙下劃線方法和一對多外鍵關係的ORM操作

一、models對象常用的方法

1、all()  

2、filter(**kwargs)    

3、get(**kwargs) 

4、exclude(**kwargs)  

5、values(*field) 

6、values_list(*field)  

7、order_by(*field)  

8、reverse() 

9、count()  

10、first()   

11、last()  

12、exists()   

二、雙下劃線使用

1、xx__lt    小於

2、xx__gt    大於

3、xx__lte    小於等於

4、xx__gte    大於等於

5、xx__in    包含某些值

6、exclude(age__in=[11,32])  不包含

7、 xx__contains()   (包含某個字符的記錄)和xx__icontains()   (忽略大小寫的包含)

8、xx__range     查找範圍

9、xx__startwith  (獲取以xx開頭的記錄) xx__istartwith(獲取以xx開頭的記錄,忽略大小寫)

10、xx__endwith( 獲取以xx結尾的記錄) xx__iendwith(獲取以xx結尾的記錄,忽略大小寫)

11、 xx__date  可以根據年月日進行過濾

三、一對多關係

(一)查詢

1、正向查詢  查詢對應學科

2、反向查詢  查詢學Python的學員

(二)增加

1、正向增加

2、反向增加

(三)刪除

(四)修改

1、正向修改

2、反向修改


一、models對象常用的方法

1、all()  

查詢所有結果  QuerySet對象,輸出結果的數據類型是一個列表類型,列表中的元素對應每一行的元素

2、filter(**kwargs)    

包含所有篩選條件符合的對象 輸出結果的數據類型是一個列表類型,列表中的元素對應每一行的元素

3、get(**kwargs) 

返回與所給篩選條件相匹配的對象,返回結果有且只有一個,如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。

4、exclude(**kwargs)  

它包含了與所給篩選條件不匹配的對象  返回的是一個QuerySet對象,是一個列表,列表內部是對應的每行元素的對象

5、values(*field) 

返回一個ValueQuerySet——一個特殊的QuerySet,運行後得到的並不是一系列model的實例化對象,而是一個可迭代的字典序列  返回的是一個QuerySet對象,是一個列表,列表中嵌套的的是行元素組成的字典

6、values_list(*field)  

它與values()非常相似,它返回的是一個元組序列,返回的是一個QuerySet對象,是一個列表,列表中嵌套的的是行元素中的值,每個值組成的元組形式

7、order_by(*field)  

對查詢結果排序 返回的是一個QuerySet對象,是一個列表,列表中嵌套的是排序後的結果對象

8、reverse() 

對查詢結果反向排序,請注意reverse()通常只能在具有已定義順序的QuerySet上調用(在model類的Meta中指定ordering或調用order_by()方法)。返回的是一個QuerySet對象,是一個列表,列表中嵌套的是排序後的結果對象

9、count()  

返回數據庫中匹配查詢(QuerySet)的對象數量,是一個int類型

10、first()   

返回第一條記錄,返回結果是一個對象

11、last()  

返回最後一條記錄,返回結果是一個對象

當輸出結果爲空時,first和last方法可以返回空,但若對其進行索引調用則會出現報錯情況

12、exists()   

如果QuerySet包含數據,就返回True,否則返回False 輸出爲boolean類型,不需要使用參數

二、雙下劃線使用

1、xx__lt    小於

xx__lt    小於

2、xx__gt    大於

xx__gt    大於

3、xx__lte    小於等於

xx__lte    小於等於

4、xx__gte    大於等於

xx__gte    大於等於

5、xx__in    包含某些值

ret = person_model.filter(age__in=[12,22])

6、exclude(age__in=[11,32])  不包含

exclude(age__in=[11,32])  不包含

 

7、 xx__contains()   (包含某個字符的記錄)和xx__icontains()   (忽略大小寫的包含)

xx__contains()   包含某個字符的記錄


xx__icontains()   忽略大小寫的包含

8、xx__range     查找範圍

xx__range     查找範圍

9、xx__startwith  (獲取以xx開頭的記錄) xx__istartwith(獲取以xx開頭的記錄,忽略大小寫)

 

ret = person_model.filter(name__startwith='t')

ret = person_model.filter(name__istartwith='t')

10、xx__endwith( 獲取以xx結尾的記錄) xx__iendwith(獲取以xx結尾的記錄,忽略大小寫)

ret = person_model.filter(name__endwith='t')

ret = person_model.filter(name__iendwith='t')

11、 xx__date  可以根據年月日進行過濾

ret = person_model.filter(birthday__year=2019)

注:返回的所有結果均是列表形式,列表元素是查找到的結果的詳細信息

 

三、一對多關係

(一)查詢

1、正向查詢  查詢對應學科

student_obj = models.Student.objects.get(name = 'zs')
subiect_obj = models.Subiect.objects.get(id=student_obj.subject_id)

#或者
subiect_obj = student_obj.subject   #返回一個對象

2、反向查詢  查詢學Python的學員

sub = models.Subject.objects.get(name="python")
stu = sub.student_set.all() # 默認使用 類名小寫_set 屬性進行關聯

(二)增加

1、正向增加

##方法一
sub = models.Subject.objects.get(name='java')
stu = models.Student()
stu.name = '鉤子'
stu.subject_id = sub.id
stu.save()

##方法二
stu = models.Student.objects.create(
    name = 'lianzi',
    subject = sub
)

 

2、反向增加

java學科新增一個學員
sub = models.Subject.objects.get(name='java')
sub.student_set.create(name='Lianzi')

(三)刪除

models.Student.objects.get(name='鉤子').delete()

models.Student.objects.filter(name__contains='子').delete()

# java科目畢業 級聯刪除學員
models.Subject.objects.get(name='java').delete()

(四)修改

1、正向修改

##方法一
# zs轉學java
sub = models.Subject.objects.get(name='java')
stu = models.Student.objects.get(name='zs')
stu.subject = sub
stu.save()

##方法二
sub = models.Subject.objects.get(name='java')
models.Student.objects.filter(name='zs').update(subject=sub)



 

2、反向修改

 

sub = models.Subject.objects.get(name='java')
stu1 = models.Student.objects.get(name='zs')
stu2 = models.Student.objects.get(name='ls')

sub.student_set.set([stu1,stu2])






 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章