今日內容:
模型層(orm模型表)
數據庫
記錄
1,在djang中新增測試腳本
1,可以在根目錄下新建一個py文件。列如test.py文件
2,在文件中寫入以下代碼即可
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day55.settings")
import django
django.setup()
2,單表操作
1,表的字段增刪改查
2,記錄的增刪改查
3,神奇的雙下滑查詢
"""
查看orm內部sql語句的方法有哪些
1.如果是queryset對象 那么可以點query直接查看該queryset的內部sql語句
2.在django項目的配置文件中 配置一下參數即可實現所有的orm在查詢的時候自動打印對應的sql語句
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
"""
4連表查詢:
1,一對多字段的增刪改查
增
1,傳數字,
用外鍵關聯字段時,直接傳數字,即關聯的id值就可以 例如 publish_id=1
models.Book.objects.create(title='三國演義',price=899.99,publish_id=1)
2,傳對象,
當不是外鍵字段時,如果用publish= 這時候傳的是對象
是去找與之關聯表中的虛擬字段查找對象,然后把對象當做參數傳
# publish_obj = models.Publish.objects.filter(pk=2).first()
# book_obj = models.Book.objects.create(title='西游記',price=666.99,publish=publish_obj)
#改
*************
同增原理一樣:如果是實際的字段就傳數字
如果是虛擬的字段就傳對象
#傳數字
# models.Book.objects.filter(pk=5).update(publish_id=3)
#傳對象
publish_obj = models.Publish.objects.filter(pk=2).first()
models.Book.objects.filter(pk=7).update(publish=publish_obj)
#刪
#在django的orm中默認的是級聯更新,級聯刪除,
# 關聯表中增加數據,刪除數據,被關聯表也會隨之發送改變
models.Publish.objects.filter(pk=2).delete()
2,多對多字段的增刪改查
add() 增 傳數字,對象
set() 改 傳數字,對象 ,必須是可迭代對象
remove() 刪 傳數字,對象
以上可以傳多個
clear() 刪所有 括號內不要傳參數
# 增
add()
1,add括號中傳數字
# 主鍵為6的書籍增加一個作者
book_obj = models.Book.objects.filter(pk=6).first()
print(book_obj.authors) 此時為None,就是跳到了第三張表
#對象點擊多對多虛擬字段時,會直接多對多的第三張表
#此時book_obj.authors就是直接跨到第三張表
book_obj.authors.add(1) # 此時就是給id為6的書籍添加一個作者
book_obj.authors.add(2,3)
# add括號中既可以傳一個數字,又可以傳多個數字
# 括號中一個數字,此時就是給id為6的書籍添加一個作者,
# 所以括號中有幾個數字,就是添加幾個作者,數字表示的是作者的id號
2,add括號中傳對象
增加一條
book_obj = models.Book.objects.filter(pk=4).first()
aut_obj = models.Author.objects.filter(pk=3).first()
book_obj.authors.add(aut_obj)
增加多條
book_obj = models.Book.objects.filter(pk=5).first()
book_obj1= models.Book.objects.filter(pk=5).first()
aut_obj = models.Author.objects.filter(pk=2).first()
aut_obj1= models.Author.objects.filter(pk=1).first()
aut_obj2 = models.Author.objects.filter(pk=9).first()
book_obj.authors.add(aut_obj,aut_obj1,aut_obj2)
book_obj1.authors.add(aut_obj1)
總結:
add是給書籍添加作者 括號內既可以傳數字也可以傳作者對象
並且支持一次性傳多個 逗號隔開就可以
注意 :對象點虛擬字段就是跳到了第三張表
改:
將主鍵為5的書籍對象 作者修改為2,3
set()
括號中以列表的形式,是可迭代對象才可以傳一個參數也要以列表的形式
1,傳數字,
book_obj = models.Book.objects.filter(pk=5).first()
book_obj.authors.set([5,]) 傳一個參數
book_obj.authors.set([2,3]) 傳多個參數
本質就是修改,有點類似於刪除,把不要的刪除,把要的留下來
2,傳作者對象
aut_obj = models.Author.objects.filter(pk=2).first()
aut_obj1= models.Author.objects.filter(pk=1).first()
aut_obj2 = models.Author.objects.filter(pk=9).first()
book_obj.authors.set([aut_obj,aut_obj1,aut_obj2])
總結:
set()括號內 需要傳一個可迭代對象
可迭代對象 可以是多個數字組合
也可以是多個對象組合
但是不能混在一起使用,即不能既有數字,又有對象!!!
要么純數字,要么純對象
刪:
remove()
1,傳數字
book_obj = models.Book.objects.filter(pk=5).first()
book_obj.authors.remove(3)
2,傳對象
aut_obj = models.Author.objects.filter(pk=2).first()
aut_obj1= models.Author.objects.filter(pk=1).first()
aut_obj2 = models.Author.objects.filter(pk=9).first()
book_obj.authors.remove(aut_obj)
book_obj.authors.remove(aut_obj,aut_obj1,aut_obj2)
總結:
remove()括號內既可以傳數字 也可以傳對象
並且支持傳多個,逗號隔開即可
將某本書和作者的關系全部清空,用clear()
即清空當前這個作者與書籍的關系
book_obj = models.Book.objects.filter(pk=5).first()
book_obj.authors.clear()
跨表查詢:
正向與反向的概念
# 一對一
# 正向:author---關聯字段在author表里--->authordetail 按字段
# 反向:authordetail---關聯字段在author表里--->author 按表名小寫
# 一對多
# 正向:book---關聯字段在book表里--->publish 按字段
# 反向:publish---關聯字段在book表里--->book 按表名小寫_set.all() 因為一個出版社對應着多個圖書
# 多對多
# 正向:book---關聯字段在book表里--->author 按字段
# 反向:author---關聯字段在book表里--->book 按表名小寫_set.all() 因為一個作者對應着多個圖書
正向查詢按外鍵字段
反向查詢按表名小寫
基於對象的跨表查詢(子查詢:將一張表的查詢結果當做另外一個查詢語句的條件)
強調:在書寫orm語句的時候 跟寫sql語句一樣
不要嘗試着 一次性寫完 應該做到寫一點看一點再一點
1,如果外鍵字段在你當前這張表中,那么如果由你當前這張表向另一張表查詢就是正向
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day55.settings")
import django
django.setup()
2,單表操作
1,表的字段增刪改查
2,記錄的增刪改查
3,神奇的雙下滑查詢
"""
查看orm內部sql語句的方法有哪些
1.如果是queryset對象 那么可以點query直接查看該queryset的內部sql語句
2.在django項目的配置文件中 配置一下參數即可實現所有的orm在查詢的時候自動打印對應的sql語句
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
"""
4連表查詢:
1,一對多字段的增刪改查
增
1,傳數字,
用外鍵關聯字段時,直接傳數字,即關聯的id值就可以 例如 publish_id=1
models.Book.objects.create(title='三國演義',price=899.99,publish_id=1)
2,傳對象,
當不是外鍵字段時,如果用publish= 這時候傳的是對象
是去找與之關聯表中的虛擬字段查找對象,然后把對象當做參數傳
# publish_obj = models.Publish.objects.filter(pk=2).first()
# book_obj = models.Book.objects.create(title='西游記',price=666.99,publish=publish_obj)
#改
*************
同增原理一樣:如果是實際的字段就傳數字
如果是虛擬的字段就傳對象
#傳數字
# models.Book.objects.filter(pk=5).update(publish_id=3)
#傳對象
publish_obj = models.Publish.objects.filter(pk=2).first()
models.Book.objects.filter(pk=7).update(publish=publish_obj)
#刪
#在django的orm中默認的是級聯更新,級聯刪除,
# 關聯表中增加數據,刪除數據,被關聯表也會隨之發送改變
models.Publish.objects.filter(pk=2).delete()
2,多對多字段的增刪改查
add() 增 傳數字,對象
set() 改 傳數字,對象 ,必須是可迭代對象
remove() 刪 傳數字,對象
以上可以傳多個
clear() 刪所有 括號內不要傳參數
# 增
add()
1,add括號中傳數字
# 主鍵為6的書籍增加一個作者
book_obj = models.Book.objects.filter(pk=6).first()
print(book_obj.authors) 此時為None,就是跳到了第三張表
#對象點擊多對多虛擬字段時,會直接多對多的第三張表
#此時book_obj.authors就是直接跨到第三張表
book_obj.authors.add(1) # 此時就是給id為6的書籍添加一個作者
book_obj.authors.add(2,3)
# add括號中既可以傳一個數字,又可以傳多個數字
# 括號中一個數字,此時就是給id為6的書籍添加一個作者,
# 所以括號中有幾個數字,就是添加幾個作者,數字表示的是作者的id號
2,add括號中傳對象
增加一條
book_obj = models.Book.objects.filter(pk=4).first()
aut_obj = models.Author.objects.filter(pk=3).first()
book_obj.authors.add(aut_obj)
增加多條
book_obj = models.Book.objects.filter(pk=5).first()
book_obj1= models.Book.objects.filter(pk=5).first()
aut_obj = models.Author.objects.filter(pk=2).first()
aut_obj1= models.Author.objects.filter(pk=1).first()
aut_obj2 = models.Author.objects.filter(pk=9).first()
book_obj.authors.add(aut_obj,aut_obj1,aut_obj2)
book_obj1.authors.add(aut_obj1)
總結:
add是給書籍添加作者 括號內既可以傳數字也可以傳作者對象
並且支持一次性傳多個 逗號隔開就可以
注意 :對象點虛擬字段就是跳到了第三張表
改:
將主鍵為5的書籍對象 作者修改為2,3
set()
括號中以列表的形式,是可迭代對象才可以傳一個參數也要以列表的形式
1,傳數字,
book_obj = models.Book.objects.filter(pk=5).first()
book_obj.authors.set([5,]) 傳一個參數
book_obj.authors.set([2,3]) 傳多個參數
本質就是修改,有點類似於刪除,把不要的刪除,把要的留下來
2,傳作者對象
aut_obj = models.Author.objects.filter(pk=2).first()
aut_obj1= models.Author.objects.filter(pk=1).first()
aut_obj2 = models.Author.objects.filter(pk=9).first()
book_obj.authors.set([aut_obj,aut_obj1,aut_obj2])
總結:
set()括號內 需要傳一個可迭代對象
可迭代對象 可以是多個數字組合
也可以是多個對象組合
但是不能混在一起使用,即不能既有數字,又有對象!!!
要么純數字,要么純對象
刪:
remove()
1,傳數字
book_obj = models.Book.objects.filter(pk=5).first()
book_obj.authors.remove(3)
2,傳對象
aut_obj = models.Author.objects.filter(pk=2).first()
aut_obj1= models.Author.objects.filter(pk=1).first()
aut_obj2 = models.Author.objects.filter(pk=9).first()
book_obj.authors.remove(aut_obj)
book_obj.authors.remove(aut_obj,aut_obj1,aut_obj2)
總結:
remove()括號內既可以傳數字 也可以傳對象
並且支持傳多個,逗號隔開即可
將某本書和作者的關系全部清空,用clear()
即清空當前這個作者與書籍的關系
book_obj = models.Book.objects.filter(pk=5).first()
book_obj.authors.clear()
跨表查詢:
正向與反向的概念
# 一對一
# 正向:author---關聯字段在author表里--->authordetail 按字段
# 反向:authordetail---關聯字段在author表里--->author 按表名小寫
# 一對多
# 正向:book---關聯字段在book表里--->publish 按字段
# 反向:publish---關聯字段在book表里--->book 按表名小寫_set.all() 因為一個出版社對應着多個圖書
# 多對多
# 正向:book---關聯字段在book表里--->author 按字段
# 反向:author---關聯字段在book表里--->book 按表名小寫_set.all() 因為一個作者對應着多個圖書
正向查詢按外鍵字段
反向查詢按表名小寫
基於對象的跨表查詢(子查詢:將一張表的查詢結果當做另外一個查詢語句的條件)
強調:在書寫orm語句的時候 跟寫sql語句一樣
不要嘗試着 一次性寫完 應該做到寫一點看一點再一點
1,如果外鍵字段在你當前這張表中,那么如果由你當前這張表向另一張表查詢就是正向
關系字段在你當前這張表,由你這張表去查,正向
關系字段不在你當前這張表,由你這張表去查,反向
正向查詢按外鍵字段
反向查詢按表名小寫
# 基於對象的跨表查詢(子查詢:將一張表的查詢結果當做另外一個查詢語句的條件)
#查詢書籍為4的出版社名稱
book_obj = models.Book.objects.filter(pk=4).first()
print(book_obj.publish.name)
print(book_obj.publish.addr)
# 查詢書籍id是5的作者姓名
book_obj = models.Book.objects.filter(pk=5).first()
print(book_obj.authors) # app01.Author.None
#書籍有多個作者,所以拿到為None
print(book_obj.authors.all()) 拿到的是對象,
當你外鍵字段對應的值有多個的時候就用all(),為一個的時候就不用all()
# 查詢作者是jason的家庭住址
auth_obj = models.Author.objects.filter(name='jason').first()
print(auth_obj.author_detail.addr)
反向查詢:
# 查詢出版社是東方出版社出版的書籍
publish_obj = models.Publish.objects.filter(name='東方出版社').first()
print(publish_obj.book_set.all())
# 查詢作者是jason寫過的所有書籍
# auth_obj = models.Author.objects.filter(name='jason').first()
# print(auth_obj.book_set)
# print(auth_obj.book_set.all())
# 查詢作者號碼是120的作者姓名
auth_obj = models.AuthorDetail.objects.filter(phone=120).first()
print(auth_obj.author.name)
print(auth_obj.author.age)
總結:
反向查詢,當你反向查詢的結果是多個的時候就需要加 _set
當你反向查詢的結果是一個時就不需要加_set
即表名小寫即可
跨表查詢:可以連續的查詢
# 基於雙下划線的跨表查詢(其實就是連表操作)
# 查詢jason作者的手機號
res = models.Author.objects.filter(name='jason').values('author_detail__phone')
#點values就是拿某張表中的某個字段,在判斷是正向還是反向,正向放字段,
# 此時就是跨到了此表中,然后查此表字段就用__加字段名
# 反向
# res1 = models.AuthorDetail.objects.filter(author__name='jason').values('phone','author__age')
# print(res1)
關系字段不在你當前這張表,由你這張表去查,反向
正向查詢按外鍵字段
反向查詢按表名小寫
# 基於對象的跨表查詢(子查詢:將一張表的查詢結果當做另外一個查詢語句的條件)
#查詢書籍為4的出版社名稱
book_obj = models.Book.objects.filter(pk=4).first()
print(book_obj.publish.name)
print(book_obj.publish.addr)
# 查詢書籍id是5的作者姓名
book_obj = models.Book.objects.filter(pk=5).first()
print(book_obj.authors) # app01.Author.None
#書籍有多個作者,所以拿到為None
print(book_obj.authors.all()) 拿到的是對象,
當你外鍵字段對應的值有多個的時候就用all(),為一個的時候就不用all()
# 查詢作者是jason的家庭住址
auth_obj = models.Author.objects.filter(name='jason').first()
print(auth_obj.author_detail.addr)
反向查詢:
# 查詢出版社是東方出版社出版的書籍
publish_obj = models.Publish.objects.filter(name='東方出版社').first()
print(publish_obj.book_set.all())
# 查詢作者是jason寫過的所有書籍
# auth_obj = models.Author.objects.filter(name='jason').first()
# print(auth_obj.book_set)
# print(auth_obj.book_set.all())
# 查詢作者號碼是120的作者姓名
auth_obj = models.AuthorDetail.objects.filter(phone=120).first()
print(auth_obj.author.name)
print(auth_obj.author.age)
總結:
反向查詢,當你反向查詢的結果是多個的時候就需要加 _set
當你反向查詢的結果是一個時就不需要加_set
即表名小寫即可
跨表查詢:可以連續的查詢
# 基於雙下划線的跨表查詢(其實就是連表操作)
# 查詢jason作者的手機號
res = models.Author.objects.filter(name='jason').values('author_detail__phone')
#點values就是拿某張表中的某個字段,在判斷是正向還是反向,正向放字段,
# 此時就是跨到了此表中,然后查此表字段就用__加字段名
# 反向
# res1 = models.AuthorDetail.objects.filter(author__name='jason').values('phone','author__age')
# print(res1)