欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django數(shù)據(jù)映射(一對(duì)一,一對(duì)多,多對(duì)多)

 更新時(shí)間:2022年08月10日 15:25:04   作者:碼農(nóng)的禿頭之旅  
本文主要介紹了Django數(shù)據(jù)映射(一對(duì)一,一對(duì)多,多對(duì)多),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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

常用的表關(guān)聯(lián)方式有三種:

一對(duì)一映射
如: 一個(gè)身份證對(duì)應(yīng)一個(gè)人

一對(duì)多映射
如: 一個(gè)班級(jí)可以有多個(gè)學(xué)生

多對(duì)多映射
如: 一個(gè)學(xué)生可以報(bào)多個(gè)課程,一個(gè)課程可以有多個(gè)學(xué)生學(xué)習(xí)

一對(duì)一映射

  • 一對(duì)一是表示現(xiàn)實(shí)事物間存在的一對(duì)一的對(duì)應(yīng)關(guān)系。
  • 如:一個(gè)家庭只有一個(gè)戶主,一個(gè)男人有一個(gè)妻子,一個(gè)人有一個(gè)唯一的指紋信息等

語(yǔ)法

class A(model.Model):
    ...
class B(model.Model):
    屬性 = models.OneToOneField(A, on_delete=xxx)

外鍵類字段選項(xiàng)

特殊字段參數(shù)【必須項(xiàng)】:

on_delete

  • models.CASCADE 級(jí)聯(lián)刪除。 Django模擬SQL約束ON DELETE CASCADE的行為,并刪除包含F(xiàn)oreignKey的對(duì)象。
  • models.PROTECT 拋出ProtectedError 以阻止被引用對(duì)象的刪除;[等同于mysql默認(rèn)的RESTRICT]
  • models.SET_NULL 設(shè)置ForeignKey null;需要指定null=True
  • models.SET_DEFAULT 將ForeignKey設(shè)置為其默認(rèn)值;必須設(shè)置ForeignKey的默認(rèn)值。
  • … 其它參請(qǐng)參考文檔 https://docs.djangoproject.com/en/2.2/ref/models/fields/#foreignkey

其余常用的字段選項(xiàng)【非必須項(xiàng)】;如:

  • null
  • unique 等

用法示例

創(chuàng)建作家和作家妻子類

# file : xxxxxxxx/models.py
from django.db import models

class Author(models.Model):
? ? '''作家模型類'''
? ? name = models.CharField('作家', max_length=50)

class Wife(models.Model):
? ? '''作家妻子模型類'''
? ? name = models.CharField("妻子", max_length=50)
? ? author = models.OneToOneField(Author, on_delete=models.CASCADE) ?# 增加一對(duì)一屬性?

創(chuàng)建一對(duì)一的數(shù)據(jù)記錄

from .models import *
author1 = Author.objects.create(name='王老師')
wife1 = Wife.objects.create(name='王夫人', author=author1)  # 關(guān)聯(lián)王老師
author2 = Author.objects.create(name='小澤老師')  # 一對(duì)一可以沒(méi)有數(shù)據(jù)對(duì)應(yīng)的數(shù)據(jù) 

數(shù)據(jù)查詢

正向查詢

直接通過(guò)關(guān)聯(lián)屬性查詢即可

# 通過(guò) wife 找 author
from .models import Wife
wife = Wife.objects.get(name='王夫人')
print(wife.name, '的老公是', wife.author.name)

反向查詢

  • 通過(guò)反向關(guān)聯(lián)屬性查詢
  • 反向關(guān)聯(lián)屬性為實(shí)例對(duì)象.引用類名(小寫),如作家的反向引用為作家對(duì)象.wife
  • 當(dāng)反向引用不存在時(shí),則會(huì)觸發(fā)異常
# 通過(guò) author.wife 關(guān)聯(lián)屬性 找 wife,如果沒(méi)有對(duì)應(yīng)的wife則觸發(fā)異常
author1 = Author.objects.get(name='王老師')
print(author1.name, '的妻子是', author1.wife.name)
author2 = Author.objects.get(name='小澤老師')
try:
    print(author2.name, '的妻子是', author2.wife.name)
except:
    print(author2.name, '還沒(méi)有妻子')

一對(duì)多映射

  • 一對(duì)多是表示現(xiàn)實(shí)事物間存在的一對(duì)多的對(duì)應(yīng)關(guān)系。
  • 如:一個(gè)學(xué)校有多個(gè)班級(jí),一個(gè)班級(jí)有多個(gè)學(xué)生, 一本圖書只能屬于一個(gè)出版社,一個(gè)出版社允許出版多本圖書

語(yǔ)法

當(dāng)一個(gè)A類對(duì)象可以關(guān)聯(lián)多個(gè)B類對(duì)象時(shí)

class A(model.Model):
? ? ...

class B(model.Model):
? ? 屬性 = models.ForeignKey("一"的模型類, on_delete=xx)

用法示例

有二個(gè)出版社對(duì)應(yīng)五本書的情況.

清華大學(xué)出版社 有書

  • C++
  • Java
  • Python

北京大學(xué)出版社 有書

  • 西游記
  • 水滸

創(chuàng)建模型類

# file: otm/models.py
from django.db import models

class Publisher(models.Model):
?? ?'''出版社【一】'''
? ? name = models.CharField('名稱', max_length=50, unique=True)

class Book(models.Model):
? ? '''書【多】'''
? ? title = models.CharField('書名', max_length=50)
? ? publisher = ForeignKey(Publisher, on_delete=models.CASCADE)

創(chuàng)建數(shù)據(jù)

#先創(chuàng)建 '一' ,再創(chuàng)建 '多'
from .models import *
pub1 = Publisher.objects.create(name='清華大學(xué)出版社')
Book.objects.create(title='C++', publisher=pub1)
Book.objects.create(title='Java', publisher_id=1)

#高級(jí)創(chuàng)建 - 利用 反向?qū)傩?
pub2 = Publisher.objects.create(name='北京大學(xué)出版社')
pub2.book_set.create(title='西游記')

數(shù)據(jù)查詢

通過(guò) Book 查詢 Publisher【正向】

通過(guò) publisher 屬性查詢即可
???????book.publisher
 
abook = Book.objects.get(id=1)
print(abook.title, '的出版社是:', abook.publisher.name)

通過(guò) Publisher 查詢 對(duì)應(yīng)的所有的 Book 【反向】

Django會(huì)在Publisher中增加一個(gè)屬性來(lái)表示對(duì)對(duì)應(yīng)的Book們的查詢引用
屬性:book_set  等價(jià)于 objects

# 通過(guò)出版社查詢對(duì)應(yīng)的書
pub1 = Publisher.objects.get(name='清華大學(xué)出版社')
books = pub1.book_set.all()  # 通過(guò)book_set 獲取pub1對(duì)應(yīng)的多個(gè)Book數(shù)據(jù)對(duì)象
#books = Book.objects.filter(publisher=pub1)  # 也可以采用此方式獲取
print("清華大學(xué)出版社的書有:")
for book in books:
   print(book.title)

多對(duì)多映射

多對(duì)多表達(dá)對(duì)象之間多對(duì)多復(fù)雜關(guān)系,如: 每個(gè)人都有不同的學(xué)校(小學(xué),初中,高中,…),每個(gè)學(xué)校都有不同的學(xué)生…
語(yǔ)法

在關(guān)聯(lián)的兩個(gè)類中的任意一個(gè)類中,增加:

屬性 = models.ManyToManyField(MyModel)

用法示例

  • 一個(gè)作者可以出版多本圖書
  • 一本圖書可以被多名作者同時(shí)編寫
class Author(models.Model):
? ? ...

class Book(models.Model):
? ? ...
? ? authors = models.ManyToManyField(Author)

創(chuàng)建模型類

class Author(models.Model):
    '''作家模型類'''
    name = models.CharField('作家', max_length=50)
    def __str__(self):
        return self.name
    
class Book(models.Model):
    '''書模型類'''
    title = models.CharField('書名', max_length=50)
    authors = models.ManyToManyField(Author)
    def __str__(self):
           return self.title 

創(chuàng)建數(shù)據(jù)

方案1 先創(chuàng)建 author 再關(guān)聯(lián) book
    author1 = Author.objects.create(name='呂老師')
    author2 = Author.objects.create(name='王老師')
    # 呂老師和王老師同時(shí)寫了一本Python
    book11 = author1.book_set.create(title="Python")
    author2.book_set.add(book11) 
    
方案2 先創(chuàng)建 book 再關(guān)聯(lián) author
    book = Book.objects.create(title='python1')
    #郭小鬧和呂老師都參與了 python1 的 創(chuàng)作
    author3 = book.authors.create(name='guoxiaonao')
    book.authors.add(author1)

數(shù)據(jù)查詢

通過(guò) Book 查詢對(duì)應(yīng)的所有的 Author【正向】

book.authors.all() -> 獲取 book 對(duì)應(yīng)的所有的author的信息
book.authors.filter(age__gt=80) -> 獲取book對(duì)應(yīng)的作者中年齡大于80歲的作者的信息

通過(guò) Author 查詢對(duì)應(yīng)的所有的Book【反向】

Django會(huì)生成一個(gè)反向?qū)傩?book_set 用于表示對(duì)對(duì)應(yīng)的book的查詢對(duì)象相關(guān)操作

author.book_set.all()
author.book_set.filter()

到此這篇關(guān)于Django數(shù)據(jù)映射(一對(duì)一,一對(duì)多,多對(duì)多)的文章就介紹到這了,更多相關(guān)Django 數(shù)據(jù)映射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Windows 安裝 Anaconda3+PyCharm的方法步驟

    Windows 安裝 Anaconda3+PyCharm的方法步驟

    這篇文章主要介紹了Windows 安裝 Anaconda3+PyCharm的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • python代碼編寫計(jì)算器小程序

    python代碼編寫計(jì)算器小程序

    這篇文章主要為大家詳細(xì)介紹了python代碼編寫計(jì)算器小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • python用正則表達(dá)式提取/匹配中文漢字

    python用正則表達(dá)式提取/匹配中文漢字

    在使用Python的過(guò)程中,由于需求原因,我們經(jīng)常需要在文本或者網(wǎng)頁(yè)元素中用Python正則表達(dá)式匹配中文,下面這篇文章主要給大家介紹了關(guān)于python用正則表達(dá)式提取/匹配中文漢字的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • pandas dataframe添加表格框線輸出的方法

    pandas dataframe添加表格框線輸出的方法

    今天小編就為大家分享一篇pandas dataframe添加表格框線輸出的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • Python實(shí)現(xiàn)登陸文件驗(yàn)證方法

    Python實(shí)現(xiàn)登陸文件驗(yàn)證方法

    本篇文章中我們給大家分享了關(guān)于Python實(shí)現(xiàn)登陸文件驗(yàn)證的方法和技巧,有興趣的朋友們參考學(xué)習(xí)下。
    2018-10-10
  • [機(jī)器視覺(jué)]使用python自動(dòng)識(shí)別驗(yàn)證碼詳解

    [機(jī)器視覺(jué)]使用python自動(dòng)識(shí)別驗(yàn)證碼詳解

    這篇文章主要介紹了python自動(dòng)識(shí)別驗(yàn)證碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • python ftplib模塊使用代碼實(shí)例

    python ftplib模塊使用代碼實(shí)例

    這篇文章主要介紹了python ftplib模塊使用代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python編寫合并字典并實(shí)現(xiàn)敏感目錄的小腳本

    Python編寫合并字典并實(shí)現(xiàn)敏感目錄的小腳本

    這篇文章主要介紹了Python編寫合并字典并實(shí)現(xiàn)敏感目錄的小腳本,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • python中圖像通道分離與合并實(shí)例

    python中圖像通道分離與合并實(shí)例

    今天小編就為大家分享一篇python中圖像通道分離與合并實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Python使用Pillow添加水印

    Python使用Pillow添加水印

    這篇文章主要為大家詳細(xì)介紹了Python使用Pillow添加水印,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論