广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Django数据映射(一对一,一对多,多对多)
  • 364
分享到

Django数据映射(一对一,一对多,多对多)

2024-04-02 19:04:59 364人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录数据表关联关系映射一对一映射用法示例一对多映射用法示例多对多映射用法示例数据表关联关系映射 常用的表关联方式有三种: 一对一映射如: 一个身份证对应一个人 一对多映射如: 一个班

数据表关联关系映射

常用的表关联方式有三种:

一对一映射
如: 一个身份证对应一个人

一对多映射
如: 一个班级可以有多个学生

多对多映射
如: 一个学生可以报多个课程,一个课程可以有多个学生学习

一对一映射

  • 一对一是表示现实事物间存在的一对一的对应关系。
  • 如:一个家庭只有一个户主,一个男人有一个妻子,一个人有一个唯一的指纹信息等

语法

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

外键类字段选项

特殊字段参数【必须项】:

on_delete

  • models.CASCADE 级联删除。 Django模拟sql约束ON DELETE CASCADE的行为,并删除包含ForeignKey的对象。
  • models.PROTECT 抛出ProtectedError 以阻止被引用对象的删除;[等同于Mysql默认的RESTRICT]
  • models.SET_NULL 设置ForeignKey null;需要指定null=True
  • models.SET_DEFAULT 将ForeignKey设置为其默认值;必须设置ForeignKey的默认值。
  • … 其它参请参考文档 https://docs.djanGoproject.com/en/2.2/ref/models/fields/#foreignkey

其余常用的字段选项【非必须项】;如:

  • null
  • unique 等

用法示例

创建作家和作家妻子类

# 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)  # 增加一对一属性 

创建一对一的数据记录

from .models import *
author1 = Author.objects.create(name='王老师')
wife1 = Wife.objects.create(name='王夫人', author=author1)  # 关联王老师
author2 = Author.objects.create(name='小泽老师')  # 一对一可以没有数据对应的数据 

数据查询

正向查询

直接通过关联属性查询即可

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

反向查询

  • 通过反向关联属性查询
  • 反向关联属性为实例对象.引用类名(小写),如作家的反向引用为作家对象.wife
  • 当反向引用不存在时,则会触发异常
# 通过 author.wife 关联属性 找 wife,如果没有对应的wife则触发异常
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, '还没有妻子')

一对多映射

  • 一对多是表示现实事物间存在的一对多的对应关系。
  • 如:一个学校有多个班级,一个班级有多个学生, 一本图书只能属于一个出版社,一个出版社允许出版多本图书

语法

当一个A类对象可以关联多个B类对象时

class A(model.Model):
    ...

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

用法示例

有二个出版社对应五本书的情况.

清华大学出版社 有书

北京大学出版社 有书

  • 西游记
  • 水浒

创建模型类

# 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)

创建数据

#先创建 '一' ,再创建 '多'
from .models import *
pub1 = Publisher.objects.create(name='清华大学出版社')
Book.objects.create(title='C++', publisher=pub1)
Book.objects.create(title='Java', publisher_id=1)

#高级创建 - 利用 反向属性
pub2 = Publisher.objects.create(name='北京大学出版社')
pub2.book_set.create(title='西游记')

数据查询

通过 Book 查询 Publisher【正向】

通过 publisher 属性查询即可
​​​​​​​book.publisher
 
abook = Book.objects.get(id=1)
print(abook.title, '的出版社是:', abook.publisher.name)

通过 Publisher 查询 对应的所有的 Book 【反向】

Django会在Publisher中增加一个属性来表示对对应的Book们的查询引用
属性:book_set  等价于 objects

# 通过出版社查询对应的书
pub1 = Publisher.objects.get(name='清华大学出版社')
books = pub1.book_set.all()  # 通过book_set 获取pub1对应的多个Book数据对象
#books = Book.objects.filter(publisher=pub1)  # 也可以采用此方式获取
print("清华大学出版社的书有:")
for book in books:
   print(book.title)

多对多映射

多对多表达对象之间多对多复杂关系,如: 每个人都有不同的学校(小学,初中,高中,…),每个学校都有不同的学生…
语法

在关联的两个类中的任意一个类中,增加:

属性 = models.ManyToManyField(MyModel)

用法示例

  • 一个作者可以出版多本图书
  • 一本图书可以被多名作者同时编写
class Author(models.Model):
    ...

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

创建模型类

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 

创建数据

方案1 先创建 author 再关联 book
    author1 = Author.objects.create(name='吕老师')
    author2 = Author.objects.create(name='王老师')
    # 吕老师和王老师同时写了一本Python
    book11 = author1.book_set.create(title="Python")
    author2.book_set.add(book11) 
    
方案2 先创建 book 再关联 author
    book = Book.objects.create(title='python1')
    #郭小闹和吕老师都参与了 python1 的 创作
    author3 = book.authors.create(name='guoxiaonao')
    book.authors.add(author1)

数据查询

通过 Book 查询对应的所有的 Author【正向】

book.authors.all() -> 获取 book 对应的所有的author的信息
book.authors.filter(age__gt=80) -> 获取book对应的作者中年龄大于80岁的作者的信息

通过 Author 查询对应的所有的Book【反向】

Django会生成一个反向属性 book_set 用于表示对对应的book的查询对象相关操作

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

到此这篇关于Django数据映射(一对一,一对多,多对多)的文章就介绍到这了,更多相关Django 数据映射内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Django数据映射(一对一,一对多,多对多)

本文链接: https://www.lsjlt.com/news/119904.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Django数据映射(一对一,一对多,多对多)
    目录数据表关联关系映射一对一映射用法示例一对多映射用法示例多对多映射用法示例数据表关联关系映射 常用的表关联方式有三种: 一对一映射如: 一个身份证对应一个人 一对多映射如: 一个班...
    99+
    2022-11-11
  • SpringDataJpa的使用之一对一、一对多、多对多 关系映射问题
    目录SpringDataJpa的使用 -- 一对一、一对多、多对多 关系映射项目依赖项目配置sql文件(MySQL版)级联关系简述@OneToOne 一对一 关系映射1.无中间表,维...
    99+
    2022-11-13
  • mybatis的一对多映射
        延续mybatis的一对一问题,还是上面一对一举得那个例子(http://fengcl.blog.51cto.com/9961331/1875657),如果一...
    99+
    2022-10-18
  • hibernate 一对多 关系映射
    在关系中,或多或少的表之间有复杂的关联关系这里测试 一对多 关联关系的配置开发步骤就不多说了。直接看一个示例。users 用户 和  shop商品订单表分析:一个用户可以有多个商品订单,一个订单只...
    99+
    2022-10-18
  • Java Hibernate中一对多和多对多关系的映射方式
    目录Hibernate的一对多和多对多Hibernate的一对多Hibernate的一对多配置Hibernate的一对多操作Hibernate的多对多Hibernate的多对多配置H...
    99+
    2023-05-18
    Java Hibernate一对多 Java Hibernate多对多
  • Flasksqlalchemy一对多与多对一与一对一及多对多关系介绍
    目录配置项定义外键定义关系属性双向的关系属性使用关系属性添加数据一对一多对多这里以作者和文章来演示一对多的关系:一个作者可以有多篇文章,但是一篇文章只能有一个作者。 配置项 首先,配...
    99+
    2022-11-11
  • mybatis怎么实现一对多映射
    这篇文章主要讲解了“mybatis怎么实现一对多映射”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mybatis怎么实现一对多映射”吧!mybatis 一对多映射 column属性注意事项昨...
    99+
    2023-06-26
  • 怎么在Hibernatede 中配置一个一对多映射
    这篇文章将为大家详细讲解有关怎么在Hibernatede 中配置一个一对多映射,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。第一步 创建两个实体类,公司和员工写核心配置文件hibernate...
    99+
    2023-05-31
    hibernatede te
  • *.hbm.xml文件——单表映射、双向多对一以及多对多的配置
    这是单表映射的配置:Student.hbm.xml<xml version="1.0" encoding="utf-8"> <!DOCTYPE hiberna...
    99+
    2022-10-18
  • thinkphp关于模型一对多,多对多,多对一的使用
    首先看看thinkphp5.0的模型介绍 这里关联有一对一,多对多,一对多,多对一。还有预载入(就是查询预写好,php界面调用时候才查询)还有关联统计,聚合等。这里只讲解通过一对一的预载入,推...
    99+
    2023-09-01
    服务器 thinkphp 模型 php 一对一 Powered by 金山文档
  • Spring Boot 整合JPA 数据模型关联使用操作(一对一、一对多、多对多)
    目录表关联一对一一对多和多对一多对多表关联 上一篇介绍了JPA的简单使用,这一篇介绍JPA在表关联上的使用 一对一 配置参数JPA对于数据实体一对一映射使用的是@OneToOne注解...
    99+
    2022-11-13
  • Hibernate的一对一,一对多/多对一关联保存的实现
    目录一对一关联保存:留言表实体类配置:(主表)留言内容表配置:(从表)留言表hbm.xml配置:(主表)留言内容表hbm.xml配置:(从表)一对多/多对一保存活动表实体类配置:(主...
    99+
    2022-11-12
  • MyBatis中多对一和一对多数据的处理方法
    目录多对一的处理1、数据库设计2、搭建测试环境3、按查询嵌套处理4 、按结果嵌套处理一对多的处理1、实体类编写2、按结果嵌套处理3、按查询嵌套处理4、小结多对一的处理 多对一的理解:...
    99+
    2023-01-03
    MyBatis多对一 MyBatis一对多处理
  • Hibernate映射一对多关联关系是什么
    这篇文章主要讲解了“Hibernate映射一对多关联关系是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate映射一对多关联关系是什么”吧!在域模型中,类和类之间最普通的关系...
    99+
    2023-06-17
  • MyBatis如何实现多表查询(多对一、一对多)
    MyBatis实现多表查询  一、多对一查询 数据库的准备 创建两张表,一张老师表,一张学生表 将老师主键id关联学生外键tid 创建sql的语句 create ta...
    99+
    2022-11-12
  • hibernate 多对多关系映射
    学生 和 课程就是一种多对多的关系映射,那么再hibernate中,对于多对多关系在怎么配置?和一些注意的事项?简单测试下。建表实体配置文件和映射测试1。使用oracle ,建表sqlcreate ...
    99+
    2022-10-18
  • MySQL创建多对多和一对一关系方法
    目录一、创建多对多1.学生表2.课程表3.中间表4.插入数据5.查询学生1选了哪些科目6.查询id=2数学被谁选了 二、MySQL 创建一对一关系1.一对一2.插入数据一、...
    99+
    2022-11-13
  • MySQL如何创建多对多和一对一关系
    这篇文章主要介绍“MySQL如何创建多对多和一对一关系”,在日常操作中,相信很多人在MySQL如何创建多对多和一对一关系问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL如何创建多对多和一对一关系”的疑...
    99+
    2023-06-29
  • MyBatis一对多映射失败问题原因与解决方法(一对多查询返回结果只有一条)
    MyBatis一对多映射失败问题原因与解决方法(一对多查询返回结果只有一条) 文章目录 MyBatis一对多映射失败问题原因与解决方法(一对多查询返回结果只有一条) @[toc...
    99+
    2023-09-16
    mybatis mysql java
  • Hibernate中怎么实现多对一和一对多操作
    这期内容当中小编将会给大家带来有关Hibernate中怎么实现多对一和一对多操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、多对一和一对多概念其实这个概念上来说很简单,比如一个客户可以有多个订单,多...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作