網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
Django數(shù)據(jù)映射(一對(duì)一,一對(duì)多,多對(duì)多)_python
作者:碼農(nóng)的禿頭之旅 ? 更新時(shí)間: 2022-10-06 編程語(yǔ)言數(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()
原文鏈接:https://blog.csdn.net/weixin_45185267/article/details/125246509
相關(guān)推薦
- 2023-01-01 利用Python腳本實(shí)現(xiàn)傳遞參數(shù)的三種方式分享_python
- 2022-06-11 C#把DataTable導(dǎo)出為Excel文件_C#教程
- 2022-06-19 C++簡(jiǎn)明講解類型轉(zhuǎn)換的使用與作用_C 語(yǔ)言
- 2022-10-15 Go?Excelize?API源碼閱讀GetPageLayout及SetPageMargins_Go
- 2022-12-21 Android?RecyclerView四級(jí)緩存源碼層詳細(xì)分析_Android
- 2022-08-04 Django框架之路由用法_python
- 2023-11-26 (有效解決)Android Studio 運(yùn)行項(xiàng)目時(shí)報(bào) Package install error:
- 2022-03-30 C#中的out參數(shù)、ref參數(shù)和params可變參數(shù)用法介紹_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支