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 ...
随机推荐
- 关于对H264码流的TS的封装的相关代码实现
1 写在开始之前 在前段时间有分享一个H264封装ps流到相关文章的,这次和大家分享下将H264封装成TS流到相关实现,其实也是工作工作需要.依照上篇一样,分段说明每个数据头的封装情况,当然,一样也会 ...
- bzoj 3916: friends 瞎搞
题目: 有三个好朋友喜欢在一起玩游戏,A君写下一个字符串S,B君将其复制一遍得到T,C君在T的任意位置(包括首尾)插入一个字符得到U.现在你得到了U,请你找出S. 题解: 发现字符串的长度一定为奇数. ...
- Linux 下使用 ssh 登录局域网其他电脑的方法
Linux 下使用 ssh 登录局域网其他电脑的方法 首先查看电脑是否安装 ssh 客户端,如果没有执行下面命令安装客户端. sudo apt-get install openssh-client s ...
- [转]由Tencent://Message协议想到的一个解决方案
源代码下载:http://files.cnblogs.com/phinecos/HelloWorldProtocal.rar 前天在BruceZhang的一篇博文<求助:如何在ASP页面中调用W ...
- BZOJ4003:[JLOI2015]城池攻占
浅谈左偏树:https://www.cnblogs.com/AKMer/p/10246635.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php? ...
- grep的用法(转)
grep参数 -c : 显示匹配的行数(就是显示有多少行匹配了): -n :显示匹配内容所在文档的行号: -i :匹配时忽略大小写: -s :错误信息不输出: -v :输出不匹配内容: -o : ...
- HDU5438:Ponds(拓扑排序)
Ponds Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Sub ...
- HDOJ1114(完全背包)
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const ...
- mybatis 学习四 源码分析 mybatis如何执行的一条sql
总体三部分,创建sessionfactory,创建session,执行sql获取结果 1,创建sessionfactory 这里其实主要做的事情就是将xml的所有配置信息转换成一个Confi ...
- linux日常管理-rsync_ssh方式
现在我们有两台机器,两台机器都需要安装rsync yum -y install rsync 一台的主机名是wangshaojun IP是192.168.1.117 ,另一台的主机名是 ...