日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django(part34)--一对多映射

發布時間:2023/12/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django(part34)--一对多映射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習筆記,僅供參考


文章目錄

    • 數據表關聯關系映射
      • 一對多映射
        • 外鍵關聯ForeignKey
          • 構造函數
        • 舉個例子


數據表關聯關系映射


一對多映射


一對多是表示現實事物間存在的一對多的對應關系。比如,一個學生只能屬于一個班級,一個班級可以有多個學生;一本圖書只能屬于一個出版社,一個出版社允許出版多本書。


  • 語法

一個A類對象可以關聯多個B類對象

class A(model.Model):passclass B(model.Model):屬性 = models.ForeignKey(A模型類, ...)

外鍵關聯ForeignKey


構造函數
ForeignKey(to, on_delete, **options)
  • 參數

on_delete

models.CASCADE #級聯刪除,若設置此參數值,則當主對象被刪除時,同時刪除與其關聯的從屬對象。 models.PROTECT #如果主對象存在關聯對象時,我們刪除主對象,就會拋出ProtectedError以阻止其被刪除; SET_NULL #當刪除主對象時,從屬對象指向null SET_DEFAULT #將ForeignKey設置為其默認值;必須設置ForeignKey的默認值。

**options是常用的字段選項

null unique #等等

舉個例子


  • 定義一對多類

models.py

from django.db import models# Create your models here.class Publisher(models.Model):name = models.CharField("出版社名", max_length = 50,null = True)booknumber = models.PositiveIntegerField("初版書籍總量", default = 0)tele = models.CharField("聯系電話", max_length = 11, null = False)class Meta:db_table = "china_publisher"verbose_name = "ChinaPublisher"verbose_name_plural = "ChinaPublishers"def __str__(self):string = "出版社:%s" % (self.name)return stringclass Book(models.Model):title = models.CharField("書名", max_length = 30)exfacPrice = models.DecimalField("出廠價", max_digits = 6, decimal_places = 2,default = 0)price = models.DecimalField("售價", max_digits = 6, decimal_places = 2,default = 0)pub = models.ForeignKey(Publisher, on_delete = models.CASCADE , null=True)def __str__(self):string = "書名:%s" % (self.title) return string
  • 創建一對多的對象

打開Django shell,敲入如下代碼:

from bookstore import models pub1 = models.Publisher.objects.create(name='中國人民大學出版社', tele = "62511329", booknumber = 22000) models.Book.objects.create(title='統計學', pub=pub1) models.Book.objects.create(title='多元統計分析', pub=pub1) models.Book.objects.create(title='回歸分析', pub=pub1)pub2 = models.Publisher.objects.create(name='高等教育出版社', tele = "82080802", booknumber = 12000) models.Book.objects.create(title='數學分析', pub=pub2) models.Book.objects.create(title='高等代數', pub=pub2)
  • 查詢

通過多查一:

#通過一本書找到對應的出版社 abook = models.Book.objects.get(title='統計學') print(abook.title, '的出版社是:', abook.pub.name)

輸出:

In [2]: abook = models.Book.objects.get(title='統計學')...: print(abook.title, '的出版社是:', abook.pub.name)...: 統計學 的出版社是: 中國人民大學出版社

通過一查多:

#通過出版社查詢對應的書 pub1 = models.Publisher.objects.get(name='中國人民大學出版社') books = pub1.book_set.all() #通過book_set獲取pub1對應的多個Book對象 #相當于 #books = models.Book.objects.filter(pub=pub1) print("清華大學出版社的書有:") for book in books:print(book.title)

輸出:

In [3]: #通過出版社查詢對應的書...: pub1 = models.Publisher.objects.get(name='中國人民大學出版社')...: books = pub1.book_set.all()...: #通過book_set獲取pub1對應的多個Book對象...: #相當于...: #books = models.Book.objects.filter(pub=pub1)...: print("清華大學出版社的書有:")...: for book in books:...: print(book.title)...: 清華大學出版社的書有: 統計學 多元統計分析 回歸分析

我們看一下mywebdb數據庫中china_publisher數據表:

mysql> select * from china_publisher; +----+--------------------+------------+----------+ | id | name | booknumber | tele | +----+--------------------+------------+----------+ | 1 | 中國人民大學出版社 | 22000 | 62511329 | | 2 | 高等教育出版社 | 12000 | 82080802 | +----+--------------------+------------+----------+ 2 rows in set (0.00 sec)

再看一下mywebdb數據庫中bookstore_book數據表:

mysql> select * from bookstore_book; +----+-------------------+------------+-------+--------+ | id | title | exfacPrice | price | pub_id | +----+-------------------+------------+-------+--------+ | 1 | Djangoweb開發實戰 | 0.00 | 0.00 | NULL | | 2 | python | 0.00 | 0.00 | NULL | | 3 | R | 0.00 | 0.00 | NULL | | 5 | 算法 | 0.00 | 0.00 | NULL | | 6 | 集體智慧編程 | 0.00 | 0.00 | NULL | | 8 | 統計學 | 0.00 | 0.00 | 1 | | 9 | 多元統計分析 | 0.00 | 0.00 | 1 | | 10 | 回歸分析 | 0.00 | 0.00 | 1 | | 11 | 數學分析 | 0.00 | 0.00 | 2 | | 12 | 高等代數 | 0.00 | 0.00 | 2 | +----+-------------------+------------+-------+--------+ 10 rows in set (0.01 sec)

bookstore_book數據表的pub_id字段關聯了china_publisher數據表中的id字段,所以pub_id=1表示中國人民大學出版社,pub_id=2表示高等教育出版社。


最后,我們啟動服務,并向http://127.0.0.1:8000/admin/bookstore/book/發起請求:

點擊高等代數:

可以看到,在高等代數的記錄中,pub默認為高等教育出版社,但是它有一個可選框,我們可以在中國人民大學出版社和高等教育出版社之間選擇。

現在,我們將高等代數的出版社改為中國人民大學出版社,并點擊保存。

現在,查看我們的bookstore_book數據表:

mysql> select * from bookstore_book; +----+-------------------+------------+-------+--------+ | id | title | exfacPrice | price | pub_id | +----+-------------------+------------+-------+--------+ | 1 | Djangoweb開發實戰 | 0.00 | 0.00 | NULL | | 2 | python | 0.00 | 0.00 | NULL | | 3 | R | 0.00 | 0.00 | NULL | | 5 | 算法 | 0.00 | 0.00 | NULL | | 6 | 集體智慧編程 | 0.00 | 0.00 | NULL | | 8 | 統計學 | 0.00 | 0.00 | 1 | | 9 | 多元統計分析 | 0.00 | 0.00 | 1 | | 10 | 回歸分析 | 0.00 | 0.00 | 1 | | 11 | 數學分析 | 0.00 | 0.00 | 2 | | 12 | 高等代數 | 0.00 | 0.00 | 1 | +----+-------------------+------------+-------+--------+ 10 rows in set (0.00 sec)

很好!記錄已經被更新!

總結

以上是生活随笔為你收集整理的Django(part34)--一对多映射的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。