多表增加
# 一對一
#查詢要被關聯的屬相對象
au_obj = models.AuthorDetail.objects.get(id=4)
models.Author.objects.create(
name='海狗',
age=59,
#方式一:直接通過數據庫的字段名au_id增加,一對一時,數據必須是沒有關聯過的,否則會報錯
au_id=4,
#方式二:通過屬性models類的屬性添加,首先要查出要關聯的對象,然后通過屬性關聯,一對一數據必須未關聯
au=au_obj,)
#一對多
pub_obj = models.Publish.objects.get(id=3)
models.Book.objects.create(
title='xx2',
price=13,
publishDate='2011-11-12',
#方式一:直接通過數據庫的字段名au_id增加,如果關鍵字為數據庫字段名稱,那么值為關聯數據的值
publishs_id=3,
#方式二:通過屬性models類的屬性添加, #類屬性作為關鍵字時,值為model對象
publishs=pub_obj,)
#多對多
多對多添加數據是在中間表中添加關聯,只能通過屬性操作
#查找要關聯的作者
ziwen = models.Author.objects.get(id=3)
haigou = models.Author.objects.get(id=5)
new_obj = models.Book.objects.create(
title='海狗產后護理第二部',
price=0.5,
publishDate='2019-09-29',
publishs_id=2,
)
#方式一*:
new_obj.authors.add(3, 5)
#方式二:
new_obj.authors.add(*[3, 5]) # 用的最多,
#方式三:
new_obj.authors.add(ziwen, haigou)
多表刪除
#一對一
#刪除被關聯表的數據,級聯刪除,會自動刪除關聯表中的數據,如果沒有設置級聯刪除,就不會刪除關聯表中的數據
models.AuthorDetail.objects.filter(id=3).delete()
#通過外鍵表刪除,只會刪除自己的數據,被關聯表中的數據不會刪除
models.Author.objects.filter(id=3).delete()
#一對多(和一對一的一樣)
models.Publish.objects.filter(id=3).delete()
models.Book.objects.filter(id=4).delete()
#多對多
#多表刪除只能通過刪除中間表的關聯信息,來消除關聯,
#獲取要消除關聯的數據,(書籍)
book_obj = models.Book.objects.get(id=2)
#刪除於書籍book_obj相關的作者id為1的作者
book_obj.authors.remove(1) #刪除
#清除所有於書籍book_obj相關的關聯數據
book_obj.authors.clear() # 清除
#重新設置於書籍book_obj相關的關聯作者信息
book_obj.authors.set(['1','5']) # 先清除再添加,相當於修改
多表修改
#orm表中的關聯是關聯id字段,所以修改字段數據,不會影響關聯關系,就是單表修改數據
ret = models.Publish.objects.get(id=2)
models.Book.objects.filter(id=5).update(
#通過屬性來修改字段值
title='華麗麗',
publishs=ret,
#通過數據庫字段來修改值
publishs_id=1,
)
#多對多修改,是修改中間表的數據,來設置關聯關系,通過set設置
#重新設置於書籍book_obj相關的關聯作者信息
book_obj.authors.set(['1','5']) # 先清除再添加,相當於修改
多表查詢
#一對一查詢:
# 關系屬性寫在表1,關聯到表2,那么通過表1的數據去找表2的數據,叫做正向查詢,返過來就是反向查詢
#正向查詢:
obj = models.Author.objects.filter(name='王洋').first()
#正向查詢,通過屬性查找,會自動查找被關聯表中的數據字段,對象.屬性
ph = obj.au.telephone
# 反向查詢會自動查找關聯表中的數據字段,對象.屬性對象.小寫的表名
obj = models.AuthorDetail.objects.filter(telephone=120).first()
ret = obj.author.name
print(ret)
#一對多:
#正向查詢:
obj = models.Book.objects.filter(title='海狗的慫逼人生').first()
ret = obj.publishs.name
#反向查詢:
#一堆多的情況下,反向查詢是從關聯表的數據查找被關聯表中的數據,可能是多條數據,
obj = models.Publish.objects.filter(name='24期出版社').first()
#表名后面加__set就是可能查找到多條數據時使用,通過all的方式獲取所有查詢到的結果
ret = obj.book_set.all() #查詢到的是QuerySet對象
#通過foe循環,查看每個結果的字段值
for i in ret:
print(i.title)
#多對多:
#正向查詢:建表時的關系屬性寫在那個表中,通過這個表去查詢,就是正向查詢
obj = models.Book.objects.filter(title='海狗的慫逼人生').first()
ret = obj.authors.all()
#反向查詢:
查詢一個作者寫了多少書
obj = models.Author.objects.filter(name='海狗').first()
ret = obj.book_set.all()
for i in ret:
print(i.publishs.name)
print(i.title)