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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Django(part34)--一对多映射

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

學(xué)習(xí)筆記,僅供參考


文章目錄

    • 數(shù)據(jù)表關(guān)聯(lián)關(guān)系映射
      • 一對多映射
        • 外鍵關(guān)聯(lián)ForeignKey
          • 構(gòu)造函數(shù)
        • 舉個例子


數(shù)據(jù)表關(guān)聯(lián)關(guān)系映射


一對多映射


一對多是表示現(xiàn)實事物間存在的一對多的對應(yīng)關(guān)系。比如,一個學(xué)生只能屬于一個班級,一個班級可以有多個學(xué)生;一本圖書只能屬于一個出版社,一個出版社允許出版多本書。


  • 語法

一個A類對象可以關(guān)聯(lián)多個B類對象

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

外鍵關(guān)聯(lián)ForeignKey


構(gòu)造函數(shù)
ForeignKey(to, on_delete, **options)
  • 參數(shù)

on_delete

models.CASCADE #級聯(lián)刪除,若設(shè)置此參數(shù)值,則當主對象被刪除時,同時刪除與其關(guān)聯(lián)的從屬對象。 models.PROTECT #如果主對象存在關(guān)聯(lián)對象時,我們刪除主對象,就會拋出ProtectedError以阻止其被刪除; SET_NULL #當刪除主對象時,從屬對象指向null SET_DEFAULT #將ForeignKey設(shè)置為其默認值;必須設(shè)置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("聯(lián)系電話", 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
  • 創(chuàng)建一對多的對象

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

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

通過多查一:

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

輸出:

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

通過一查多:

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

輸出:

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

我們看一下mywebdb數(shù)據(jù)庫中china_publisher數(shù)據(jù)表:

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

再看一下mywebdb數(shù)據(jù)庫中bookstore_book數(shù)據(jù)表:

mysql> select * from bookstore_book; +----+-------------------+------------+-------+--------+ | id | title | exfacPrice | price | pub_id | +----+-------------------+------------+-------+--------+ | 1 | Djangoweb開發(fā)實戰(zhàn) | 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 | 統(tǒng)計學(xué) | 0.00 | 0.00 | 1 | | 9 | 多元統(tǒng)計分析 | 0.00 | 0.00 | 1 | | 10 | 回歸分析 | 0.00 | 0.00 | 1 | | 11 | 數(shù)學(xué)分析 | 0.00 | 0.00 | 2 | | 12 | 高等代數(shù) | 0.00 | 0.00 | 2 | +----+-------------------+------------+-------+--------+ 10 rows in set (0.01 sec)

bookstore_book數(shù)據(jù)表的pub_id字段關(guān)聯(lián)了china_publisher數(shù)據(jù)表中的id字段,所以pub_id=1表示中國人民大學(xué)出版社,pub_id=2表示高等教育出版社。


最后,我們啟動服務(wù),并向http://127.0.0.1:8000/admin/bookstore/book/發(fā)起請求:

點擊高等代數(shù):

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

現(xiàn)在,我們將高等代數(shù)的出版社改為中國人民大學(xué)出版社,并點擊保存。

現(xiàn)在,查看我們的bookstore_book數(shù)據(jù)表:

mysql> select * from bookstore_book; +----+-------------------+------------+-------+--------+ | id | title | exfacPrice | price | pub_id | +----+-------------------+------------+-------+--------+ | 1 | Djangoweb開發(fā)實戰(zhàn) | 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 | 統(tǒng)計學(xué) | 0.00 | 0.00 | 1 | | 9 | 多元統(tǒng)計分析 | 0.00 | 0.00 | 1 | | 10 | 回歸分析 | 0.00 | 0.00 | 1 | | 11 | 數(shù)學(xué)分析 | 0.00 | 0.00 | 2 | | 12 | 高等代數(shù) | 0.00 | 0.00 | 1 | +----+-------------------+------------+-------+--------+ 10 rows in set (0.00 sec)

很好!記錄已經(jīng)被更新!

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。