DAY77-Django框架(八)
生活随笔
收集整理的這篇文章主要介紹了
DAY77-Django框架(八)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
今日內(nèi)容:創(chuàng)建多表模型、多表數(shù)據(jù)操作、基于對象的跨表查詢、基于雙下劃線的跨表查詢
一、創(chuàng)建多表模型
class Author(models.Model):# id如果不寫,會(huì)自動(dòng)生成,名字叫nid,并且自增id = models.AutoField(primary_key=True)name = models.CharField(max_length=32)sex = models.IntegerField()#一對一的關(guān)系:OneToOneField(to='表名',to_field='主鍵')#OneToOneField相當(dāng)于ForeignKey(unique=True),唯一性約束,但是會(huì)報(bào)警告,不建議用authordetail = models.OneToOneField(to='AuthorDetail',to_field='id')class AuthorDetail(models.Model):id = models.AutoField(primary_key=True)phone = models.CharField(max_length=32)addr = models.CharField(max_length=64)class Publish(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=32)addr = models.CharField(max_length=64)email = models.EmailField()class Book(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=32)price = models.DecimalField(max_digits=6,decimal_places=2)#一對多的關(guān)系:ForeignKey(to='表名',to_field='主鍵')publish = models.ForeignKey(to='Publish',to_field='id')#多對多的關(guān)系:ManyToManyField會(huì)自動(dòng)創(chuàng)建第三張表authors = models.ManyToManyField(to='Author')二、多表數(shù)據(jù)操作
一對多
#添加數(shù)據(jù) #方式一 book = models.Book.objects.create(name='三國演義',price=25.89,publish_id=1) #方式二,存對象 #pk是指主鍵,id不一定是主鍵。 publish = models.Publish.objects.filter(pk=1).first() book = models.Book.objects.create(name='金瓶',price=69.96,publish=publish)#刪除數(shù)據(jù) #操作與單表一樣#修改數(shù)據(jù) #與添加一樣 #方式一 book=Book.objects.filter(pk=1).update(publish=出版社對象) book=Book.objects.filter(pk=1).update(publish_id=1) #方式二 book=Book.objects.get(pk=1) book.publish=出版社對象 | book.publish_id=2 book.save()多對多
author1 = models.Author.objects.get(name='小明') author2 = models.Author.objects.get(name='小紅') book = models.Book.objects.get(name='紅樓夢')#add:添加數(shù)據(jù) #方法一:添加作者對象 book.authors.add(author1,author2) #方法二:添加作者ID book.authors.add(1,2)#remove:刪除數(shù)據(jù),可以刪除一個(gè)或多個(gè) #方法一:刪除作者對象 book.authors.remove(author2) #方法二:刪除作者ID book.authors.remove(1)#clear:清空對象中的所有 book.authors.clear()#set:先清空,在新增,要傳一個(gè)列表,列表內(nèi)可以是, id,也可以是對象,但是不要混用 book.authors.set([2,3])三、基于對象的跨表查詢
一對一
#正向:關(guān)聯(lián)字段在哪里,從哪里開始就是正向。正向查詢按字段 #查詢小明作者的手機(jī)號 author = models.Author.objects.filter(name='小明').first() authordetail = author.authordetail#authordetail是字段名 print(authordetail.phone)#反向:反向查詢按表名小寫 #查詢地址是北京的作者名字 authordetail = models.AuthorDetail.objects.filter(addr='北京').first() author = authordetail.author#author是表名 print(author.name)一對多
#正向:正向查詢按字段 # 查詢紅樓夢這本書的出版社郵箱 book = models.Book.objects.filter(name='紅樓夢').first() publish = book.publish print(publish.email)#反向:反向按表名小寫_set.all() # 查詢地址是北京 的出版社出版的圖書 publish = models.Publish.objects.filter(addr='北京').first() book = publish.book_set.all() print(book)多對多
#正向:正向查詢按字段.all() #查詢紅樓夢這本書所有的作者 book = models.Book.objects.filter(name='紅樓夢').first() author = book.authors.all() print(author)#反向查詢:反向按表名小寫_set.all() #查詢小明寫的所有書 author = models.Author.objects.filter(name='小明').first() book = author.book_set.all() print(book)注:基于對象的查詢,其本質(zhì)就是多次查詢(子查詢)
四、基于雙下劃線的跨表查詢
一對一
#正向:關(guān)聯(lián)字段在哪里,從哪里開始就是正向。正向查詢按字段 #查詢小明作者的手機(jī)號 phone = models.Author.objects.filter(name='小明').values('authordetail__phone') print(phone)#反向:反向查詢按表名小寫 #查詢地址是北京的作者名字 name = models.AuthorDetail.objects.filter(addr='北京').values('author__name') print(name)轉(zhuǎn)載于:https://www.cnblogs.com/xvchengqi/p/9953909.html
總結(jié)
以上是生活随笔為你收集整理的DAY77-Django框架(八)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript 数组求交集/差集/
- 下一篇: 点击复制文本