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 ...
随机推荐
- 关于 numpy.array和list之间的转换
有两种方法: 1. 直接用list()函数 2. 用array.tolist()函数 如果np.array是一维,两者没有区别.但如果是二维结果是不同的. import numpy as np a1= ...
- 如何在Android开发中测试应用在真机上实验
1.首先将手机设置为调试模式 方法:设置——应用程序——开发——USB调试,打上√即可 2.用数据线连接至电脑 3.然后打开eclipse 右击点击工程,选择 Run as,再选择Run ...
- 【二叉查找树】05根据升序的链表构造二叉查找树【Convert Sorted List to Binary Search Tree】
利用递归,构造二叉查找树, ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给一个 ...
- 【IPC通信】key_t键和ftok函数
System V IPC分为三种: System V消息队列 System V信号量 System V共享内存区 这三种类型的IPC使用key_t值做为它们的名字. key_t这个数据类型在<s ...
- ffpanel --ffmpeg的GUI,让ffmpeg离开黑黑的命令行
程序及源码下载地址 :https://github.com/langsim/ffpanel from:http://blog.csdn.net/langsim/article/details/47 ...
- bzoj 1819: 电子字典 Trie
题目: Description 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间.带有模糊查询功 ...
- 基于无锁的C#并发队列实现
最近开始学习无锁编程,和传统的基于Lock的算法相比,无锁编程具有其独特的优点,Angel Lucifer的关于无锁编程一文对此有详细的描述. 无锁编程的目标是在不使用Lock的前提下保证并发过程中共 ...
- Parallel Programming-Paralle.For && ForEach
本文主要介绍Parallel.For以及Parallel.ForEach.Parallel.For是普通步长为1的for循环的并行代替方案.Parallel.ForEach是以集合为基准进行循环的fo ...
- ceph学习之CRUSH
CRUSH的全称是Controlled Replication Under Scalable Hashing,是ceph数据存储的分布式选择算法,也是ceph存储引擎的核心.在之前的博客里介绍过,ce ...
- Go和HTTPS
转自:http://tonybai.com/2015/04/30/go-and-https/ 近期在构思一个产品,考虑到安全性的原因,可能需要使用到HTTPS协议以及双向数字证书校验.之前只是粗浅接触 ...