python之路_django ORM模型(聯表)(一)

1、建立表python

  表說明:共有以下4張表,書籍表、出版社表、做者表、做者詳細信息表,出版社表和書籍表的關係爲一對多(外鍵寫在多的書籍表中),即一個出版社能夠有多本書;書籍和做者是多對多關係(多對多表須要另一個關係表,外鍵寫在任何一個表中均可以),即一本書能夠有多本書,一本書也能夠有多個做者;做者和做者詳細信息表時一對一關係(外鍵寫在任何一個表中均可以),即一個做者只能一個對應的做者詳細信息,反之亦然。具體建表以下:git

class Book(models.Model):
    nid=models.AutoField(primary_key=True)
    title=models.CharField(max_length=32)
    publishDate=models.DateField()
    price=models.DecimalField(max_digits=5,decimal_places=2)
    publish=models.ForeignKey("Publish")               #與Publish表創建多對一關係,會自動在此表中增長publish_id字段
    authors=models.ManyToManyField("Author")           #與Author表創建多對多關係,會自動建立一個book_authors對應關係表,包含id、book_id和authors_id字段

class Publish(models.Model):
    nid=models.AutoField(primary_key=True)
    name=models.CharField(max_length=32)
    email=models.EmailField()


class Author(models.Model):
    nid=models.AutoField(primary_key=True)
    name=models.CharField(max_length=32)
    age=models.IntegerField()
   

class AuthorDetail(models.Model):
    nid = models.AutoField(primary_key=True)
    adrr=models.CharField(max_length=32)
    email=models.EmailField()

  author = models.OneToOneField("Author") #與Author表創建一對一關係

2、數據添加code

一、一對多對象

  具體添加實例以下:blog

#方式1:
    pub_obj = Publish.objects.get(name="沙河出版社")                                                #獲取要添加的出版社models對象
    Book.objects.create(title="金品梅",publishDate="2001-12-12",price=122,publish=pub_obj)
#方式2:
    book_obj=Book.objects.create(title="金品梅3",publishDate="2011-08-12",price=112,publish_id=1)  #publish_id對應的值必須爲已知publish表中已經存在的id

二、多對多ci

  具體添加實例以下:rem

實例1:邊建立book表信息,邊綁定與做者信息的關係get

book_obj = Book.objects.create(title="金品梅3", publishDate="2011-08-12", price=112, publish_id=1)

alex=Author.objects.get(name="alex")                        #獲取已知的做者models對象
egon=Author.objects.get(name="egon")                        #獲取已知的做者models對象

book_obj.authors.add(alex,egon)                             #綁定關係

實例2:書籍信息已經建立,過後綁定與做者的關係(即追加做者信息):it

book_obj=Book.objects.filter(title="金品梅3").first()        #查找書的models對象
wenzhou=Author.objects.get(name="文州")
book_obj.authors.add(wenzhou)

實例3:將查詢到的多個queryset對象添加:class

book_obj = Book.objects.create(title="金品梅5", publishDate="2011-08-12", price=112, publish_id=1)
authors=Author.objects.all()                                #queryset對象,列表形式
book_obj.authors.add(*authors)                              #*authors將列表形式的對象打散成位置參數形式

3、數據刪除

  此處主要講述多對多表的移除和清空操做,執行此操做後,關係表中的對應的關係也會跟着被移除或清空。

一、刪除一個做者

alex=Author.objects.get(name="alex")
book_obj = Book.objects.filter(title="金品梅3").first()
book_obj.authors.remove(alex)

二、清空全部做者

book_obj = Book.objects.filter(title="金品梅3").first()
book_obj.authors.clear()

 4、基於對象跨表查詢(子查詢)

一、一對多

  對於一對多的狀況,建立表的時候咱們已經闡述,外鍵只能寫在多的書籍表中,查詢一本書的出版社稱爲正向查詢,查詢一個出版社所出版的全部書籍稱爲反向查詢,具體查詢規則和實例以下:

查詢規則:

           .publish
(Book-------(查出版社)---------->Publish)
     <-------(查出版的書籍)---------
          .book_set.all()        

實例一(正向查詢):

#查詢python這本書的出版社的名字:(正向查詢,按字段)
book_obj=Book.objects.get(title="python")
print(book_obj.publish.name)

實例二(反向查詢):

#查詢沙河出版社出版過的書籍名稱:(反向查詢按:表名_set)
pub_obj=Publish.objects.get(name="沙河出版社")
print(pub_obj.book_set.all())                                            #queryset對象
for book in pub_obj.book_set.all():
       print(book.title)

二、多對多

  對於多對多關係,在建立表的時候已經說明關聯字段放在任何一個表類中都是能夠的,本文放在Book表中,若查詢一本書的全部做者稱爲正向查詢,查詢一個做者寫的全部數據則稱爲反向查詢,具體查詢規則及實例以下:

查詢規則:

                   .authors.all()
(Book------------(查全部相關的做者)--------------->Author)
     <--------(查做者寫過全部相關的書籍)------------         
                  .book_set.all()

實例一(正向查詢):

#查詢書籍名爲紅樓夢的全部做者姓名
book_obj=Book.objects.get(title="紅樓夢") print(book_obj.authors.all()) #爲全部關聯的做者queryset對象 for author in book_obj.authors.all(): print(author.name)

 實例二(反向查詢):

#查詢alex做者所寫過的全部書籍名稱
author_obj=Author.objects.get(name="alex")
print(author_obj.book_set.all())                                            #爲全部關聯的書籍queryset對象
for book in  author_obj.book_set.all():
      print(book.title)

三、一對一

  對於一對一的關係,咱們在建表的時候一樣也說過,關聯字段放在任何一個表類中均可以,本章以將關聯字段author放在AuthorDetail表爲例,經過做者詳細信息表查詢做者爲正向查詢,經過字段便可;經過做者表查詢相應做者信息內容爲反向查詢,用表名便可。具體應用實例以下:

實例一(正向查詢):

#查詢的地址在沙河而且email是123的做者的名字                                 (正向查詢,按字段)
detail_obj=AuthorDetail.objects.get(adrr="沙河",email="123")
print(detail_obj.author.name)

實例二(反向查詢):

#查詢姓名爲alex的做者的地址addr                                            (反向查詢,按表名)
author_obj=Author.objects.get(name="alex")
print(author_obj.authordetail.adrr)

實例三(綜合實例):

#查詢住在沙河的做者出版過的全部書籍的名稱以及出版社名稱
authordetail=AuthorDetail.objects.get(addr="沙河")
author=authordetail.author                                              #正向查詢,獲得author models對象
bookList=author.book_set.all()                                          #反向查詢,獲得bookList queryset對象
for book in bookList:
     print(book.title,book.publish.name)

  總結:在上述的論述中,全部的反向的查詢的表名均爲小寫,且須要提醒的是在一對一的反向查詢中表名不須要跟set,由於它只有一個對象,經過「.表名」獲得的是一個models對象,能夠直接查詢須要的字段。

相關文章
相關標籤/搜索