Python学习---django之ORM语法[对象关系映射]180124
ORM语法[对象关系映射]
ORM: 用面向对象的方式去操作数据库的创建表以及增删改查等操作。
优点:1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句。快速开发。
2 可以避免一些新手程序猿写sql语句带来的性能问题。
缺点:1 性能有所牺牲,不过现在的各种ORM框架都在尝试各种方法,比如缓存,延迟加载登来减轻这个问题。
2 对于个别复杂查询,ORM仍然力不从心,为了解决这个问题,ORM一般也支持写raw sql。
3 通过QuerySet的query属性查询对应操作的sql语句
author_obj=models.Author.objects.filter(id=2)
print(author_obj.query)
创建表[class类创建表]:
一对一: OnetoOne
一对多: ForeignKey[外键在多的那个类/表中]
多对多: Manytomany
ORM操作
创建表[class类创建表]:
一对一: OnetoOne
一对多: ForeignKey[外键在多的那个类/表中]
多对多: Manytomany
操作表[行对象]:
增:
create:
单表增加1
models.Book.objects.create(name='FTL')
单表增加2【推荐】
dict={'name':'FTL'}
models.Book.objects.create(**dict) # 接收传递过来的字典
一对多表增加1【外键publish】
models.Book.objects.create(name='FTL', publish_id=2) # 直接添加id
一对多表增加2【外键publish,推荐根据对象添加】
publisher=models.Publish.objects.get(id=2)
# 添加单个对象,非集合【否则就变成了多对多】
models.Book.objects.create(name='FTL', publish=publisher)
多对多【推荐对象添加】
publisher=models.Publish.objects.get(id=2)
publisher1=models.Publish.objects.get(id=3)
book=models.Book.objects.get(id=2)
book.add(publish,publish1)
或者方向添加: author.book_setadd(*books) [books是列表]
save:
单表创建1、book = Book(name='FTL')
book.save();
单表创建2、book = Book()
obj.name='FTL'
ojb.save()
多表创建同上create()
删: delete, remove, clear
改: update, save
查:filter, get
创建表模型:
/blog/models.py
# --------------------------------ORM学习------------------------
from django.db import models
class Publish(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField('名称', max_length=64)
city = models.CharField('所在城市', max_length=64)
province = models.CharField('省份', max_length=30, default='BJ')
country = models.CharField('国家', max_length=33, default='CHINA')
website = models.CharField('网址', max_length=30, default="WWW")
class Meta:
verbose_name='出版社'
verbose_name_plural = verbose_name # plural 复数的
def __str__(self):
return self.name class Author(models.Model):
name = models.CharField('姓名', max_length=30)
def __str__(self):
return self.name class AuthorDetail(models.Model):
sex = models.BooleanField(max_length=1, choices=((0, '男'), (1, '女')))
email = models.EmailField('邮箱', max_length=12)
birthday = models.DateField()
author = models.OneToOneField(Author,on_delete=models.CASCADE,) class Book(models.Model):
title = models.CharField(max_length=64, verbose_name="标题")
price = models.DecimalField(max_digits=5, decimal_places=2, default=10)
page_num = models.IntegerField(null=True,editable=False) # Djangog默认可修改
# 注意是添加了引号的类,如果不添加,则需要把类放在该类的前面[否则Py解释器找不到]
author = models.ManyToManyField('Author', default='FTL') # 1本书有多个作者
# author = models.ManyToManyField(Author, default='FTL') # Author类必须在Book之前
#外键属性,django在创建表单时候会默认将publish改为publish_id[外键在多的那一方创建]
publish = models.ForeignKey('Publish', on_delete=models.CASCADE, default=1,)
publish_date = models.DateField(default='2020-20-20')
def __str__(self):
return self.title
执行命令,创建表单:
python manage.py makemigrations # 会在blog下migrations文件夹下生成一个Python文件
# F:\Django\mysite2\blog\migrations\auto_20180125_0737.py
pytyon manage.py migrate # 真正去数据库里面创建表
建表成功:

分析代码:
<1> 每个数据模型都是django.db.models.Model的子类,它的父类Model包含了所有必要的和数据库交互的方法。并提供了一个简介漂亮的定义数据库字段的语法。
<2> 每个模型相当于单个数据库表(多对多关系例外,会多生成一张关系表),每个属性也是这个表中的字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。大家可以留意下其它的类型都和数据库里的什么字段对应。
<3> 模型之间的三种关系:一对一,一对多,多对多。
一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性;
一对多:就是主外键关系;(foreign key)
多对多:(ManyToManyField) 自动创建第三张表(当然我们也可以自己创建第三张表:两个foreign key)
问题解决
遇到的问题1:
问题现象:表字段无默认值报错,建表失败

问题解决: 添加属性默认值,Py3新增加
遇到的问题2:
问题现象:外键没有设置级联删除,建表失败

问题解决: 添加级联删除,on_delete=models.CASCADE,
Python学习---django之ORM语法[对象关系映射]180124的更多相关文章
- Django——Django中的QuerySet API 与ORM(对象关系映射)
首先名词解释. ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型 ...
- ORM即 对象-关系映射(转自:微冷的雨)
ORM即 对象-关系映射: 将数据库中的数据关系表,映射为实体对象. 灵动思绪EF(Entity FrameWork) 作者: 微冷的雨 来源: 博客园 发布时间: 2013-01-22 16:2 ...
- [Python之路] ORM(对象关系映射)
一.概念 ORM是Python后端Web框架Django的核心思想,"Object Relational Mapping",即对象-关系映射,简称ORM. 一句话理解就是: 创建一 ...
- 优酷项目之 ORM(数据库对象关系映射)代码重写
前言: 我们在操作数据库时候一般都是通过sql代码来操作mysql数据库中相关数据,这就需要懂得sql语句,那么怎么样才能在不懂sql语句的情况下通过我们所学的python代码来实现对mysql数据库 ...
- ORM框架(对象关系映射)
Entity Framework 学习初级篇1--EF基本概况 http://www.cnblogs.com/xray2005/archive/2009/05/07/1452033.html ORM ...
- 【python】-- Django路由系统(网址关系映射)、视图、模板
Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...
- ORM概述(对象关系映射)
ORM概述: ORM(Object-Relational Mapping)表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到加你对象与数据库 ...
- Python学习---django之Model语法180124
django之Model语法[Models] 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1> sqlite django默认使 ...
- Python学习---django之ORM的增删改查180125
模型常用的字段类型参数 <1> CharField #字符串字段, 用于较短的字符串. #CharField 要求必须有一个参数 maxlength, 用于从数 ...
随机推荐
- Linux 命令 su 和 sudo 比较
su : 可以用来切换到任何用户,但是要求输入目标用户的密码 比如:su - su - root (等价 su -) su - user su root 与 su - root 的区别在于,后者不切换 ...
- js中请求数据的$post和$ajax区别(同步和异步问题)
$.post和$.Ajax都为页面上向后台发送请求,请求数据 1.post 因为post默认为异步请求,可是有时候我们会发现,本来要求请求马上出现,可是异步会导致后面突然再执行,这样就出很多问题 2. ...
- Struts2 resulttype
本文章只介绍较为常用的三种result type 1.dispatcher 2.redirect 3.redirectAction 一.dispatcher 用于转向JSP页面,这个是默认的结果类型, ...
- IOS bug之Code Sign error:Provisioning profile
刚才解决一个版本冲突的bug,记在了博客里,这让我想起了另外一个bug,当时犹豫公司的开发者账号过期了,我打开应用运行时提示Code Sign error:Provisioning profile ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- 读取excel的方法(可用于批量导入)
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read); //1. Reading from a binary ...
- nodejs文件上传组件multer使用
多图上传,发送端: var express = require('express') var rp = require('request-promise') var fs = require(&quo ...
- Spring Boot学习笔记(三)实现热部署
pom文件中添加如下依赖即可 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...
- Java面试题之数据库三范式是什么?
什么是范式? 简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系.所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式.在关系型数据库中这些规范就可以称 ...
- Core.Java.Volume.I.Fundamentals.10th.Edition 14.5.8 Volatile域 中文版 章节勘误
今天重扫了corejava 14 并发的一章,在谈到volatile域代替synchronized 应用于并发更新时,看到如下内容,并发更新可用内部锁的方式但会带来阻塞问题,可用volatile域替代 ...