ORM(一)
ORM常识:
1、一对多,多的一方设置外键字段,有外键字段的表叫做子表。没有外键字段的表叫做主表。
2、主表放到子表的下面,否则子表找不到主表,写数据要先往主表中写。
数据库:(1)不创建主键,会自动添加主键。
(2)创建的外键会自动添加后缀“_id”
练习题:
1、一对多、一对一
创建一个book表,有title和price字段
创建一个publish表,有name和addr字段
建立book和publish之间一对多的关系
用save和create的方法给publish表添加两条数据。
给book表添加两条数据:金瓶眉、23、出版社2;水浒传、34、出版社2 。 ||| (有save方法和create方法/知识点:一对多创建数据)
1、找到出版“金瓶眉”的出版社所在的地址(一对多查询)
2、多对多
创建一张author表,字段有name。
给book表和author表添加多对多的关系。(ManyToManyField)
给author添加两个作者:egon和alex (准备工作、用save和create两种方式完成)
给book表和author表添加关联,id=2的书同时由egon和alex两个人写。(创建数据多对多)
2-1
取消book表和author表两张表之间的关联。
参考:
book_obj.authors.clear() #直接清空绑定的关系
autho=Author.objects.get(name='alex') 找到名字叫做'alex'的作者对象
book_obj.authors.remove(autho) #删除指定的作者对象。
book_obj.delete()
2-2
给水壶传绑定所有的作者。
参考:
def add(request):
author_list=Author.objects.all() #给一本书绑定所有的作者
book_obj.authors.add(*author_list) #一本书绑定所有的作者,
3、级联删除
将金瓶眉删除和它相关联的数据也删除(级联删除)
参考:
Book_obj=Book.objects.get(id=3)
Book_obj.delete() #找到一本书的对象,然后.delete() 就可以把这本书和它对应的关系删除。
1、连接Mysql数据库
l Settings中的代码:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'books', #你的数据库名称
'USER': 'root', #你的数据库用户名
'PASSWORD': '', #你的数据库密码
'HOST': '', #你的数据库主机,留空默认为localhost
'PORT': '3306', #你的数据库端口
}
}
l __init__.py中的代码:
import pymysql
pymysql.install_as_MySQLdb() ##settings.py同一个目录的__init__.py
3、建表 day67
l Urls.py中的代码:
from app01 import views
url(r'^add/', views.add),
l Models.py
class Publish(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=32) def __str__(self): return self.name+" "+self.addr
# Book 与 Publish是一对多的关系 :models.ForeignKey(Publish) class Book(models.Model): title=models.CharField(max_length=32)
price=models.DecimalField(max_digits=6,decimal_places=2) #创建外键一对多的关系
publish=models.ForeignKey(Publish)#添加外键,括号中指定表名后,会自动识别publish表中的主键。
def __str__(self):
return self.title
2、单表添加数据
l # 添加记录两种方式:
# create 方式
Publish.objects.create(
name="老衲出版社",
addr="沙河"
) # save方式
p=Publish(name="瞎驴出版社",addr="昌平区")
p.save()
l 查询API:
表.objects.all() 得到是QuerySet集合对象------ [obj1,obj2,]
表.objects.filter(id=2) 得到是QuerySet集合对象-------[obj1,]
表.objects.get(id=2) 得到是一个Model对象 obj 有且只能有一条匹配的结果,否则报错。
3、添加一对多数据 day67
l views.py
方法1
#在执行下面的代码之前,先在publish表里面插入两条数据
# 一对多 添加一个book记录 方法1:
def add(request):
Book.objects.create(
title="python",
price=100.00,
publish_id=2
)
return HttpResponse("ok")
def add(request):
book_obj=Book.objects.get(id=1)
print(book_obj.title)
print(book_obj.price)
print(book_obj.publish) 打印id等于1的外键对象。在model.py中写了__str__,所以会打印对象的属性。
方法2
# 一对多,添加一个book记录
publish_obj=Publish.objects.get(id=1) # 一个publish对象 # 创建一个Book对象
Book.objects.create(
title="Linux",
price=29.00,
publish=publish_obj #可以为外键字段指定一个对象作为外键
)
###########################################################3
save 方法
# 一对多 save 方法
b=Book(title="",price="",publish=pub_obj)
b.save() b = Book(title="", price="", publish_id=1)
b.save()
Python manage.py makemigrations #生成数据库脚本
Python manage.py migrate #同步数据库
Python manage.py runserver 8800 #启动项目
多对多的关系day67
l Models.py中的代码
# Book 与 Publish是一对多的关系
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
def __str__(self):
return self.name+" "+self.addr
class Book(models.Model):
title=models.CharField(max_length=32)
price=models.DecimalField(max_digits=6,decimal_places=2)
publish=models.ForeignKey(Publish) #创建外键一对多的关系
authors=models.ManyToManyField("Author") # 创建外键多对多的关系。加上引号Author这张表即使在下面也可以找到
def __str__(self):
return self.title class Author(models.Model):
name=models.CharField(max_length=32)
def __str__(self):
return self.name #打印queryset集合元素的name
# 添加多对多关系
# +++++++++++++++++++通过对象绑定关系
def add(request):
book_obj=Book.objects.get(id=3) #找到id=3的书的对象
print("authors: ",book_obj.authors.all()) # 找到id=3的这本书所有关联的作者对象集合 [author1,author2,]
# 绑定关系
author_obj1=Author.objects.get(id=1) #获取作者对象
author_obj2=Author.objects.get(id=2) #获取作者对象
book_obj.authors.add(author_obj1,author_obj2) #给book和author绑定关系
return HttpResponse("OK")
#第二种情况
def add(request):
author_list=Author.objects.all() #给一本书绑定所有的作者
book_obj.authors.add(*author_list) #一本书绑定所有的作者,
*列表名:传实参 如果传列表就加* ; 如果传字典就加:**。
手动添加多对多关系表
################自己创建第三张表
Models.py中的代码
class Book2Author(models.Model):
book=models.ForeignKey("Book")
author=models.ForeignKey("Author")
views.py文件中的代码
# 向手动创建的第三张表中添加记录
b2a=Book2Author(book_id=4,author_id=3)
b2a.save()
解除多对多绑定
book_obj.authors.clear() #直接清空绑定的关系 autho=Author.objects.get(name='alex') 找到名字叫做'alex'的作者对象
book_obj.authors.remove(autho) #删除指定的作者对象。
book_obj.delete()
级联删除:day67-06-00:13:30
Book_obj=Book.objects.get(id=3)
Book_obj.delete() #找到一本书的对象,然后.delete() 就可以把这本书和它对应的关系删除。
ORM(一)的更多相关文章
- 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了
前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...
- Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms
行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...
- UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?
选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软 ...
- 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】
前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...
- CYQ.Data V5 从入门到放弃ORM系列:教程 - Log、SysLogs两个日志类使用
Log 静态类介绍: Public Static (Shared) Methods GetExceptionMessage 获取异常的内部信息 WriteLogToDB Overloaded. 将日志 ...
- CYQ.Data V5 从入门到放弃ORM系列:教程 - MAction类使用
背景: 随着V5框架使用者的快速增加,终于促使我开始对整个框架编写完整的Demo. 上周大概花了一星期的时间,每天写到夜里3点半,终完成了框架所有功能的Demo. 同时,按V5框架名称空间的顺序,对每 ...
- ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...
- 最好的5个Android ORM框架
在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...
- Asp.Net Mvc通用后台管理系统,bootstrap+easyui+权限管理+ORM
产品清单: 1.整站源码,非编译版,方便进行业务的二次开发 2.通用模块与用户等基础数据的数据库脚本 3.bootstrap3.3.1 AceAdmin模板源码 4.easyui1.3.5源码 5.F ...
随机推荐
- ffmpeg用法(心得体会还有你见过的用法)
ffmpeg的常用用法很多,我这里提供的用法有可能有许多地方是你没见过的. 一.ffmpeg合并视频 我经常需要切割再把一些零碎的视频给拼接起来,这样可以省许多磁盘空间.其实用mencoder挺不错的 ...
- 1018 Public Bike Management (30)(30 分)
时间限制400 ms 内存限制65536 kB 代码长度限制16000 B There is a public bike service in Hangzhou City which provides ...
- properties使用
properties可以load store 注释可以采用 "#" 或者"!" 分隔采用"="或者":" 分行采用&qu ...
- 冷备手工完全恢复(recover database,recover tablespace,recover datafile)
冷备手工完全恢复 1. 手工完全恢复三种级别: recover database: 所有或大部分datafile丢失,一般是在mount状态完成.recover tablespace: 非关 ...
- Asp.net工作流workflow实战(一)
最近开发一个项目用到了工作流引擎,之前研究过微软的workflow所有就用它了,距离上次用有一段时间了,好多东西有点模糊了,就在此处一遍写代码一遍回忆. 首先,在我的项目中新建了.netframwor ...
- Puppet master nginx 扩展提升性能(puppet自动化系列4)
puppet使用SSL(https)协议来进行通讯,默认情况下,puppet server端使用基于Ruby的WEBRick HTTP服务器.由于WEBRick HTTP服务器在处理agent端的性能 ...
- 杂项-权限管理:Ralasafe
ylbtech-杂项-权限管理:Ralasafe Ralasafe 是用Java编写的开源(MIT协议)访问控制中间件.它能够轻松处理登录控制.URL权限控制和(业务级)数据级权限管理,实现权限与业务 ...
- arm交叉编译 扫盲贴
ARM交叉编译工具链 为什么要用交叉编译器? 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序, 比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平 ...
- Python-连接Redis并操作
首先开启redis的外连 sch01ar@ubuntu:~$ sudo vim /etc/redis/redis.conf 把bind 127.0.0.1这行注释掉 然后重启redis sudo /e ...
- linux命令-rpm查询包
安装了哪些rpm包呢 [root@wangshaojun Packages]# rpm -qa /////查看全部安装的包 [root@wangshaojun Packages]# rpm -qa l ...