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(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...
随机推荐
- yum安装软件时,出现"No package XXX available"的解决办法
第一种: 依次执行以下命令解决 1,cd /home 2,wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noa ...
- JUC并发编程与高性能内存队列disruptor实战-下
并发理论 JMM 概述 Java Memory Model缩写为JMM,直译为Java内存模型,定义了一套在多线程读写共享数据时(成员变量.数组)时,对数据的可见性.有序性和原子性的规则和保障:JMM ...
- k8s-storage-class
1. 简介 StorageClass 为管理员提供了描述存储 "类" 的方法. 通过StorageClass的定义,管理员可以将存储资源定义为某种类别(Class),正如存储设备对 ...
- Unable to open 'free_base.cpp': Unable to read file 'c:\Program Files\Microsoft VS Code\minkernel\crts\ucrt\src\appcrt\heap\free_base.cpp'
问题 vscode编写C++程序,使用microsoft C++ Unable to open 'cvt.cpp': Unable to read file 'c:\Program Files\Mic ...
- centos6下php53升级为php7
1.查看版本 [root@web-1 blog]# php -v No log handling enabled - turning on stderr logging Created directo ...
- Android开发----RecyclerView视图的学习
RecyclerView RecyclerView是什么? RecyclerView是如今Android开发中最常用的控件,其相较于ListView和GridView的功能更为强大,优化了两者的各种不 ...
- 普罗米修斯+grafana监控k8s
其实现原理有点类似ELK.node-exporter组件负责收集节点上的metrics监控数据,并将数据推送给prometheus, prometheus负责存储这些数据,grafana将这些数据通过 ...
- 阿里巴巴发布最佳实践 | 阿里巴巴DevOps实践指南
编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...
- [luoguP4139]上帝与集合的正确用法
\(\text{Description}\) \(\text{Given a number }p(p\leqslant10^7).\) \(\text{Output }2^{2^{2^{2^{\cdo ...
- docker简单介绍。
docker是啥? 一.概念? // 和运维有关的工具,和开发没有很大的关系.只需要去调试项目,将项目运行更迅速. 二.作用? 1.只需要关心项目的编写和调试,不需要关心具体的项目需要运行在哪里,并且 ...