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 ...
随机推荐
- 【python2/3坑】从gensim的Word2Vec.load()的中文vector模型输出时显示unicode码
服务器上python2.7 打印出的e[0]对应的是 unicode码 于是分别尝试了用e[0].encode('utf-8')转码 和 e[0].decode('unicode-escape')依然 ...
- stl_deque.h
stl_deque.h // Filename: stl_deque.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http:/ ...
- CURL抓取网页内容
<?php $curl = curl_init();//初始化一个cURL对象 $url = "http://cart.jd.com/cart/cart.html?backurl=ht ...
- pthread_cond_wait()用法分析
很久没看APUE,今天一位朋友问道关于一个mutex的问题,又翻到了以前讨论过的东西,为了不让自己忘记,把曾经的东西总结一下. 先大体看下网上很多地方都有的关于pthread_cond_wait()的 ...
- 无旋Treap - BZOJ1014火星人 & 可持久化版文艺平衡树
!前置技能&概念! 二叉搜索树 一棵二叉树,对于任意子树,满足左子树中的任意节点对应元素小于根的对应元素,右子树中的任意节点对应元素大于根对应元素.换言之,就是满足中序遍历为依次访问节点对应元 ...
- QT之在QML中使用C++类和对象
QML其实是对ECMAScript的扩展,融合了Qt object系统,它是一种新的解释性语言,QML引擎虽然由Qt C++实现,但QML对象的运行环境说到底和C++对象的上下文环境是不通的,是平行的 ...
- docker-ce安装与搭建私有仓库
https://www.cnblogs.com/sszhou/p/7389144.html 系统环境centos7 ###docker-ce安装###1.卸载老版本,较老版本的Docker被称为doc ...
- 获得Azure订阅LoadBalancer的脚本
有客户希望可以通过一条命令获得一个Azure订阅中所有的负载均衡器. 目前在Azure的powershell中是没有这中命令的.但我们可以通过脚本的方式实现. 下面就是获得所有负载均衡的脚本: par ...
- Python:生成器函数
生成器函数:包含yield语句的函数: 生成器对象:生成器对象和迭代器对象行为相似,都支持可迭代接口:__next__(),若想执行生成器函数内部语句,则需要迭代协议’ A.生成器函数被调用时,并不会 ...
- yum软件包管理器
Yum (Yellow dog Updater, Modified) 黄狗升级器是一个在 Fedora 中的字符前端软件包管理器.基于 RPM 包管理(介绍见RPM包及其管理),能够从指定的服务器自动 ...