当前位置: 首页 > news >正文

Django——orm模块创建表关系

django orm中如何创建表关系

1. 表关系分析

表与表之间的关系: 一对多 多对多  一对一 没有关系
判断表关系的方法: 换位思考

用4张表举例:  图书表 出版社表 作者表 作者详情表
    图书和出版社是一对多的关系 外键字段建在多的那一方
    图书和作者是多对多的关系 需要创建第三张表来专门存储
    作者与作者详情表是一对一   
    
提示: 创建表关系  先将基表创建出来 然后再添加外键字段. 这里建表可以没有先后顺序, 不同于mysql中建立外键的创建表以及插入记录的先后顺序.

 

2. 建立表

book
idtitlepricepublish_id
1python从入门到入土123.121
2生蚝的吃法大全666.661
3说不是渣男本质其实就是444.442
author
idnameage
1jason84
2egon73
book2author
idbook_idauthor_id
111
212
322
433
publish
idnameadd
1北方出版社北京
2南方出版社南京
author2detail
idphoneinfo
180080088我喜欢跑步, 所以我是跑王
288888888我喜欢吃生蚝和装逼

 

3. 建立外键表关系基本语法

# django orm中建立表关系
    一对一:
        author_detail = models.OneToOneField(to='AuthorDetail')
    一对多:
        publish = models.ForeignKey(to='Publish')
    多对多:
        authors = models.ManyToManyField(to='Book')
    拓展: 还可以有另一种书写方式, 不过这种方式必须放在被关联的类后. 这里必须放在Publish定义之后
        publish = models.ForeignKey(to=Publish)

        
# 特点和注意事项:
    1. 先建立基表最后再建立外键关系, 没有sql中建立外键必须先建立被关联表, 加入记录先插入被关联表这么一说, 直接建立就行.
    2. django 1.x版本无序指定级联更新级联删除, 默认会帮你指定.
    3. 一对多, 一对一无需在需要关联的字段后面加_id, 默认会帮你加. 例如: publish -> publish_id
    4. 一对多的表关系外键字段建立在多的一方
    5. 多对多的表关系无需类似于sql语句需要建立中间表, 会默认帮你创建虚拟的中间表
    6. 一对一, 多对多的表关系外键字段建立在查询频率较高的地方.

4. 在models.py中创建以上模型类

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255, verbose_name='书名')
    price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='价格')  # 总共八位 小数点后面占两位

    # 一. 建立一对多关系: 图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面
    """
    如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id
    如果你自作聪明的加了_id那么orm还是会在后面继续加_id

    后面在定义ForeignKey的时候就不要自己加_id
    """
    publish = models.ForeignKey(to='Publish')  # 默认就是与出版社表的主键字段做外键关联

    # 二. 建立多对多关系: 图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
    """
    authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
    让orm自动帮你创建第三张关系表
    """
    authors = models.ManyToManyField(to='Author')


class Publish(models.Model):
    name = models.CharField(max_length=255, verbose_name='出版社名称')
    addr = models.CharField(max_length=255, verbose_name='出版社地址')


class Author(models.Model):
    name = models.CharField(max_length=255, verbose_name='作者姓名')
    age = models.IntegerField(verbose_name='作者年龄')
    # 三. 建立一对一关系: 作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中
    """
    OneToOneField也会自动给字段加_id后缀
    所以你也不要自作聪明的自己加_id
    """
    author_detail = models.OneToOneField(to='AuthorDetail')


class AuthorDetail(models.Model):
    phone = models.BigIntegerField(verbose_name='作者电话号码')
    addr = models.CharField(max_length=255, verbose_name='作者家庭住址')

django请求生命周期流程图

相关文章:

  • Rust教程6:并发编程和线程通信
  • 基于pytorch使用特征图输出进行特征图可视化
  • Spring Boot 校验用户上传的图片文件
  • 【Qt】撤销/恢复的快捷键
  • Git基本概念和使用方式
  • 【MySQL系列】第二章 · SQL(上)
  • Rd-03D串口协议
  • 【Opencv】cv::dnn::NMSBoxes()函数详解
  • 华为云Ascend310服务器使用
  • JVM在线分析-监控工具(jps, jstat, jstatd)
  • 智慧城市建设解决方案分享【完整】
  • 为 Ubuntu 虚拟机构建 SSH 服务器
  • 2023年11月在线IDE流行度最新排名
  • 基于springboot的在线文档管理系统
  • 基于springboot实现桥牌计分管理系统项目【项目源码】计算机毕业设计
  • Android Studio里的C/C++返回: ld: error: undefined symbol
  • 【Go入门】面向对象
  • Vatee万腾科技决策力的未来展望:开创数字化创新的新高度
  • 音视频基础知识
  • Linux之基础开发工具gdb调试器的使用(三)
  • 芬兰西南部两架直升机相撞坠毁,第一批救援队已抵达现场
  • 复原展出孙吴大墓,江苏首座考古博物馆将开放
  • 陕西旱情实探:大型灌区农业供水有保障,大旱之年无旱象
  • 5吨煤炭“瞬间蒸发”?掺水炭致企业损失千万,腐败窝案曝光
  • 一手实测深夜发布的世界首个设计Agent - Lovart。
  • 通辽警方侦破一起积压21年的命案:嫌疑人企图强奸遭反抗后杀人