Django中ORM创建表关系
一:django中ORM创建表关系
- ORM创建外键关系
1.表与表之间的关系
1.表与表之间的关系
一对多
一对一
多对多
2.操作目标条件:
图书表
出版社表
作者表
作者详情表
3.外键关联
一对多:
图书和出版社是一对多的关系 外键字段建在多的那一方 book
多对多:
图书和作者是多对多的关系 需要创建第三张表来专门存储
一对一:
作者与作者详情表是一对一
4.表关系的判断
换位思考
ORM针对外键字段的创建位置
1.不常用的数据我们称之为冷数据
2.常用的数据我们称之为热数据
一对多: 外键创建在多的一方
一对一: 建在任何一方都可以 但是推荐建在查询频率较高的表中
多对多: orm自动帮你创建第三张关联表
2.ORM中如何定义三种关系
1.一对多
(图书和出版社是一对多) 并且书是多的一方 所有外键字段放在书表里面
# 默认就是与出版社表的主键字段做外键关联
publish = models.ForeignKey(to='Publish')
如果字段对应的是Foreignkey 那么会orm会自动子啊字段的后面加_id
如果自己自作聪明的加了id 那么orm还是会在后面继续加_id
后面在定义Foreignkey的时候就不要自己加_id
2.多对多
# 自动帮你创建书籍和作者的第三张表
authors = models.ManyToManyField(to='Author')
authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
让orm自动帮你创建第三张关系表
3.一对一
# 作者与作者详细是一对一的关系 外键建在查询频率较高的表中
author_detail = models.OneToOneField(to='AuthorDetail')
OneToOneField也会自动给字段加_id后缀
所有不要自作聪明 自己加后缀_id
# 会自动在字段后面加_id后缀
ForeignKey
OneToOneField
3.ORM创建表关系models.py文件
from django.db import models
# 图书表
class Book(models.Model):
# title varchar(32)
title = models.CharField(max_length=32)
# 总共八位 小数点后面占两位 9价格)
print = models.DecimalField(max_digits=8,decimal_places=2)
# (图书和出版社是一对多) 并且书是多的一方 所有外键字段放在书表里面
# 默认就是与出版社表的主键字段做外键关联
publish = models.ForeignKey(to='Publish')
"""
如果字段对应的是Foreignkey 那么会orm会自动子啊字段的后面加_id
如果自己自作聪明的加了id 那么orm还是会在后面继续加_id
后面在定义Foreignkey的时候就不要自己加_id
"""
# # 自动帮你创建书籍和作者的第三张表
authors = models.ManyToManyField(to='Author')
# authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
# 让orm自动帮你创建第三张关系表
# 出版社表
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
# 作者表
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
# 作者与作者详细是一对一的关系 外键建在查询频率较高的表中
author_detail = models.OneToOneField(to='AuthorDetail')
"""
OneToOneField也会自动给字段加_id后缀
所有不要自作聪明 自己加后缀_id
"""
# 作者详细信息表
class AuthorDetail(models.Model):
# phone 电话
phone = models.BigIntegerField() # 或者直接字符类型
# addr 地址
addr = models.CharField(max_length=32)
4.在settings.py配置文件修改配置
- mysql提前创建好库
1.在settings.py配置文件修改配置
"""django默认使用自带的sqlite3"""
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day60', # 数据库名称 一定要事先创建好才能指定
'HOST':'127.0.0.1', # 数据库IP,暂用本地回环地址
'PORT':3306, # 数据库端口
'USER':'root', # 数据库用户名
'PASSWORD':'123', # 数据库密码
'CHARSET':'utf8' # 指定字符编码
}
}
5.在项目文件夹或者应用文件夹内的__init__.py文件中书写固定的代码
2.在项目文件夹或者应用文件夹内的__init__.py文件中书写固定的代码
import pymysql
pymysql.install_as_MySQLdb()
在django1.X版本中外键默认都是级联更新删除的

Django中ORM创建表关系的更多相关文章
- Django之ORM多表关系创建
ORM模型多表逻辑创建: 以图书和作者关系模型为例: models.py from django.db import models ''' 一本书只能被一个出版社出版; 一个出版社可以出版多本书; 一 ...
- ORM以及Django使用ORM创建表
day61 2018-04-28 1. 内容回顾 1. HTTP协议消息的格式: 1. 请求(request) 请求方法 路径 HTTP/1.1\r\n k1:v1\r\n ...\r\n \r\n ...
- Python--day61--ORM介绍及Django使用ORM创建表
ORM: 使用django的ORM详细步骤:(pymysql操作数据库:) #1,自己动手创建数据库(create database 数据库名字;) #2,在Django项目中(setting.py文 ...
- django 数据库 ORM创建表单是出错
WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default' HINT: MySQL ...
- django中orm多表查询,减少数据库查询操作
.select_related() 的使用
- Django中ORM多对多表的操作
自己创建第三张表建立多对多关系 表的创建 # 老师表和学生表可以是一个多对多的关系,建表时可以手动建立第三张表建立关联 class Student(models.Model): name = mode ...
- Django中ORM介绍和字段及其参数
ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
- Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)
Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...
- Django中ORM对数据库的增删改查操作
前言 什么是ORM? ORM(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...
随机推荐
- 在 python 项目中如何记录日志
一. 概述 写本文的目的是我在写 python 项目的时候需要记录日志,我忘记怎么处理了,每次都需要去网上查一遍,好记性不如烂笔头, 这里把查阅的内容记录下来,方便以后查找. python 项目中记录 ...
- MMI开机时间偏长
Mini版本开机时间长 Mini版本开机时间长1. Problem Description:2. Analysis:3. Solution:4. Summary: 1. Problem Descr ...
- JVM组成详解
一.JVM 整体组成 JVM 整体组成可分为以下四个部分: 类加载器(ClassLoader) 运行时数据区(Runtime Data Area) 执行引擎(Execution Engine) 本地库 ...
- 介绍一下主流的浏览器的开发者工具(js调试和查看网络请求)
1.打开开发者工具:右键-->检查 (快捷键 f12) 2.开发者工具介绍: (1): 选择页面的dom进行查看 (2):设备适配 (3)元素: ① 可以查找到界面对应的dom: ② 通过计算样 ...
- CSS3 动画3D视角下 旋转圆环
首先是 transform 属性: transform 属性向元素应用 2D 或 3D 转换.该属性允许我们对元素进行旋转.缩放.移动或倾斜. 加上对应属性则可得到3D透视效果下的形态 本次以圆形( ...
- Sentry 开发者贡献指南 - 浏览器 SDK 集成测试
Sentry 的浏览器 SDK 的集成测试在内部使用 Playwright.这些测试在 Chromium.Firefox 和 Webkit 的最新稳定版本上运行. https://playwright ...
- @WebServlet注解(Servlet注解)
@WebServlet 注解的属性 @WebServlet 用于将一个类声明为 Servlet,该注解会在部署时被容器处理,容器根据其具体的属性配置将相应的类部署为 Servlet.该注解具有下表给出 ...
- java中的继承 和多态。
package com.aaa.zxf.ajax.test; /** *一. java 中的继承和多态. * * 继承的特性? * 1.实现继承的方式 * A 如何建立继承关系(一个类继承于 另一个类 ...
- LeetCode.241
241. 为运算表达式设计优先级 题目大意 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含 + - * 思路: ...
- ApacheCN 编程/大数据/数据科学/人工智能学习资源 2019.12
公告 我们的所有非技术内容和活动,从现在开始会使用 iBooker 这个名字. "开源互助联盟"已终止,我们对此表示抱歉和遗憾.除非特地邀请,我们不再推广他人的任何项目. 公众号自 ...