• Django——orm模块创建表关系


    django orm中如何创建表关系

    1. 表关系分析

    1. 表与表之间的关系: 一对多 多对多 一对一 没有关系
    2. 判断表关系的方法: 换位思考
    3. 4张表举例: 图书表 出版社表 作者表 作者详情表
    4. 图书和出版社是一对多的关系 外键字段建在多的那一方
    5. 图书和作者是多对多的关系 需要创建第三张表来专门存储
    6. 作者与作者详情表是一对一
    7. 提示: 创建表关系 先将基表创建出来 然后再添加外键字段. 这里建表可以没有先后顺序, 不同于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. 建立外键表关系基本语法

    1. # django orm中建立表关系
    2. 一对一:
    3. author_detail = models.OneToOneField(to='AuthorDetail')
    4. 一对多:
    5. publish = models.ForeignKey(to='Publish')
    6. 多对多:
    7. authors = models.ManyToManyField(to='Book')
    8. 拓展: 还可以有另一种书写方式, 不过这种方式必须放在被关联的类后. 这里必须放在Publish定义之后
    9. publish = models.ForeignKey(to=Publish)
    10. # 特点和注意事项:
    11. 1. 先建立基表最后再建立外键关系, 没有sql中建立外键必须先建立被关联表, 加入记录先插入被关联表这么一说, 直接建立就行.
    12. 2. django 1.x版本无序指定级联更新级联删除, 默认会帮你指定.
    13. 3. 一对多, 一对一无需在需要关联的字段后面加_id, 默认会帮你加. 例如: publish -> publish_id
    14. 4. 一对多的表关系外键字段建立在多的一方
    15. 5. 多对多的表关系无需类似于sql语句需要建立中间表, 会默认帮你创建虚拟的中间表
    16. 6. 一对一, 多对多的表关系外键字段建立在查询频率较高的地方.

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

    1. from django.db import models
    2. class Book(models.Model):
    3. title = models.CharField(max_length=255, verbose_name='书名')
    4. price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='价格') # 总共八位 小数点后面占两位
    5. # 一. 建立一对多关系: 图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面
    6. """
    7. 如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id
    8. 如果你自作聪明的加了_id那么orm还是会在后面继续加_id
    9. 后面在定义ForeignKey的时候就不要自己加_id
    10. """
    11. publish = models.ForeignKey(to='Publish') # 默认就是与出版社表的主键字段做外键关联
    12. # 二. 建立多对多关系: 图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
    13. """
    14. authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
    15. 让orm自动帮你创建第三张关系表
    16. """
    17. authors = models.ManyToManyField(to='Author')
    18. class Publish(models.Model):
    19. name = models.CharField(max_length=255, verbose_name='出版社名称')
    20. addr = models.CharField(max_length=255, verbose_name='出版社地址')
    21. class Author(models.Model):
    22. name = models.CharField(max_length=255, verbose_name='作者姓名')
    23. age = models.IntegerField(verbose_name='作者年龄')
    24. # 三. 建立一对一关系: 作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中
    25. """
    26. OneToOneField也会自动给字段加_id后缀
    27. 所以你也不要自作聪明的自己加_id
    28. """
    29. author_detail = models.OneToOneField(to='AuthorDetail')
    30. class AuthorDetail(models.Model):
    31. phone = models.BigIntegerField(verbose_name='作者电话号码')
    32. addr = models.CharField(max_length=255, verbose_name='作者家庭住址')

    django请求生命周期流程图

  • 相关阅读:
    dlt-daemon安装教程
    Threads and Locks
    基于C#实现的小型动物识别推理系统
    掌握Go语言:探索Go语言中的循环奇妙世界,从基础到实战(13)
    进程:execve加载流程
    Sqoop的安装与配置 第1关:Sqoop的安装与配置
    mac 查看端口占用
    瑞利-贝纳尔对流(Rayleigh–Bénard convection)
    【02】Spring源码-手写篇-手写DI实现
    【DB运营管理/开发解决方案】上海道宁为您提供提高工作便利性的集成开发工具——Orange
  • 原文地址:https://blog.csdn.net/m0_71115526/article/details/134332814