Django 3.0 ORM ForiengKey (單對多)

這篇博客會簡單介紹 ORM 的觀念,以及用 ORM 來 增、查、刪、改 資料庫表

ORM 概念

它是透過 Python 中的物件導向生成實例對象來操作資料庫的表(Table)
有了這個實例對象我們就可以對資料庫中的紀錄進行操作囉 !

有人會說用 SQL 就好啦幹嘛還要用 ORM ?
不過大家想想為什麼會有 ORM 的出現呢 ?
雖然說 ORM 不是必需的,但必須得用 ! ! 除非你 SQL 很熟練 ! (堅持要用的那種~

因為相對於 SQL 來說 ORM 語句用起來更靈活、簡單 !
二來就是 ORM 在資料庫搬遷這部分是非常容易的喔~

假如你是用MySQL的語法寫,有天你要更換資料庫,那就意味著有些SQL語句不適用了,沒辦法完全搬遷,那這樣就麻煩了還要重新設計 !
But, ORM不是萬能的,假如一碰到複雜的情況(查詢),還是用SQL來的好(性能)

了解了觀念之後接下來開始,建立 一對多(foreign key relationship) 的數據模型

book / models.py

# 作者
class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField('作者', max_length=30, default='')
    email = models.EmailField()

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tb_author'

# 書
class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='book')
    book_name = models.CharField('書名', max_length=50, default='')
    price = models.DecimalField('TWD$', max_digits=4, decimal_places=0)

    def __str__(self):
        return self.book_name

    class Meta:
        db_table = 'tb_book'

在 Django console 中操作。

新增一筆資料

a = Author.objects.create(name='大頭菜', email='aa123@gmail.com')

這裡的 a 就是個實例對象。去看看資料庫 !

tb_author
在这里插入图片描述
接下來新增 tb_book 去看看資料庫 !
實例對象的用途就在這 ! ! !

a.book.create(book_name='Java程式設計:從入門到放棄', price=999)

tb_book

(https://img-blog.csdnimg.cn/20201009011335180.png#pic_center)

這裡大家可能會有點疑問 ? 為什麼會有 author_id ,它其實是外鍵 (FK),它對應到的是 tb_author主鍵 id (PK)。兩張表就是靠 author_id 來關聯的 ! ! !

大家會不會覺得說。這樣資料一筆一筆新增太慢了,根本沒效率(方便性),那你們有想到要怎麼解決嗎 ?
想到了嗎? 封裝一個函數 !

Django Console

def insert_data():
      data = {'蒂芬妮':'Tiffany@gmail.com', '莉莉安':'Lilian@gmail.com', '阿二':'Aji@gmail.com'}
      for k, v in data.items():
          Author.objects.create(name=k, email=v)
insert_data()

tb_author 成功新增三筆資料!

在这里插入图片描述
Dango Console

def insert_tb_book():
		a1 = Author.objects.get(id=2)
     data = {'線性代數':890, '微積分':560, '統計學':1000}
     for k, v in data.items():
         a1.book.create(book_name=k, price=v)
 insert_tb_book()

tb_book 一樣的操作 !
在这里插入图片描述
阿…剛剛我們資料輸入錯了 ! 作者 : 大頭菜的JAVA程式設計:從入門到放棄,書本定價應該是778元,我們要怎麼修改呢 ?

應該是要先找到作者, 然後再去找他的,找到之後 ~ 更新它的價錢 !

a = Author.objects.get(name='大頭菜')
a.book.filter(book_name='Java程式設計:從入門到放棄').update(price=778)

tb_book

在这里插入图片描述
現在我們要刪掉微積分這本書, 因為作者: 蒂芬妮抄襲,被迫下架了 ! 其實操作方式都一樣只是 update 換成 delete 而已,就這樣很簡單

a = Author.objects.get(name='蒂芬妮')
a.book.filter(book_name='微積分').delete()

這樣就把它下架了 !

在这里插入图片描述
在做下個操作前,我們要對 models.py 做一些更動,要 加上書的編號

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='book')
    book_id = models.PositiveIntegerField('編號', default=10001)
    book_name = models.CharField('書名', max_length=50, default='')
    price = models.DecimalField('(TWD$)', max_digits=4, decimal_places=0)

    def __str__(self):
        return '編號:{} 作者:{} 書名:{} 價錢:{}'.format(self.book_id, self.author.name, self.book_name, self.price)

tb_book 是不是發現,我跟你的資料不一樣呀,出個小練習,把資料表變得跟我一樣,剛剛學的就足以操作了 ! ! !
在这里插入图片描述
完成之後,繼續接下來內容囉 ~

咦 ! 最近有點想學人工智慧 (AI), 聽說要學 線性代數, 那我去買一本好了。可是我的預算只有 700 元, 去找找看有沒有好了。 要怎麼寫呢 ?

這段代碼的意思是 從Book中 搜尋線性代數 這本書,然後再找價錢低於 700 元 的書 !
你看有兩本線性代數,符合你的需求。
有一點要記
get()返回的是一个對象
filter()返回的是由對象组成的列表,稱為 QuerySet 集合 !
這裡我也是簡略帶過,之後會有更詳細的介紹 !

Book.objects.filter(book_name='線性代數').filter(price__lte=700)
<QuerySet [<Book: 編號:10004 作者:莉莉安 書名:線性代數 價錢:666>, <Book: 編號:10005 作者:阿二 書名:線性代數 價錢:590>]>

接下來要介紹

正向查詢 透過作者,找尋書本 !

蒂芬妮出了哪幾本書 !

a = Author.objects.get(name='蒂芬妮')
a.book.all()
<QuerySet [<Book: 編號:10002 作者:蒂芬妮 書名:線性代數 價錢:890>, <Book: 編號:10003 作者:蒂芬妮 書名:統計學 價錢:1000>]>

逆向查詢 透過書本,找尋作者 !

誰是這本JAVA程式設計:從入門到放棄的作者 !

b = Book.objects.get(book_name='Java程式設計:從入門到放棄')
b.author.name
'大頭菜'

很簡單吧 !

下一篇文章見囉 ~ ~ ~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值