ORM操作mysql數據庫多表的增刪改查


多表增加

# 一對一
	#查詢要被關聯的屬相對象
    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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM