一. ORM简介 

概念:.ORM框架是用于实现面向对象编程语言种不同类型系统的数据之间的转换

构建模型的步骤:重点

(1).配置目标数据库信息,在seting.py中设置数据库信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'bms',# 要连接的数据库,连接前需要创建好
'USER':'root',# 连接数据库的用户名
'PASSWORD':'',# 连接数据库的密码
'HOST':'127.0.0.1',# 连接主机,默认本级
'PORT':3306 # 端口 默认3306
}
} (2) 构建虚拟对象数据库,在APP的models.py中以类的形式定义模型
所定义的模型类似于mysql中的表
from django.db import models
# Create your models here.
class Book(models.Model):
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=32)
price=models.DecimalField(max_digits=5,decimal_places=2)
publish=models.CharField(max_length=32)
pub_date=models.DateTimeField()
def __str__(self):
return self.title
class Mate:
db_table="book" #给创建的模型定义一个别名

(3) 通过模型在目标数据库中创建相应的表,
#注意:在建表之前必须先创建好seting.py文件中mysql配置的库
在建表之前要在url.py路由分发的同级目录下的启动文件__init__.py中导入
import pymysql
pymysql.install_as_MySQLdb() 然后在项目路径文件下执行以下命令在mysql中创建表
python manage.py makemigrations
python manage.py migrate (4) 在URL分发器中配置路由转发
from django.contrib import admin
from django.urls import path
from app01 import views urlpatterns = [
path('admin/', admin.site.urls),
path('add/',views.add),
path('query/',views.query)
] (5) 在视图函数views.py中 ,通过对模型的操作实现对数据库的操作
#1 添加记录
def add(request):
# 方式1:
# book=Book(title="Python",price="200",publish="人民出版社",pub_date="2012-12-12")
# book.save()
# print(book.title)
# 方式2:
book=Book.objects.create(title="go",price="",publish="人民出版社",pub_date="2012-12-12")
book=Book.objects.create(title="java",price="",publish="人民出版社",pub_date="2012-12-12")
# print(book.title)
# print(book.price)
return HttpResponse("添加成功") #2 查询操作
def query(request):
'''
# KEY : 一定区分queryset对象与模型类对象 # 1 all() : 查询所有记录
queryset=Book.objects.all()
print(queryset)
# <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>]>
# <QuerySet [<Book: Python>, <Book: Linux>]> for obj in queryset: # queryset对象是模型类对象的集合
print(obj.title)
print(obj.price) print(queryset[0].title)
# print(queryset.title) #X
print(queryset.count()) # 2 first() ,last() #第一个最后一个
book_obj=Book.objects.all().first() # 返回模型类对象
print(book_obj.title)
book_obj=Book.objects.all().last() # 返回模型类对象
print(book_obj.title)
# 3 filter:返回的queryset对象
queryset=Book.objects.all().filter(price=100)
print(queryset) #<QuerySet []>
queryset=Book.objects.filter(title="Python",price=100)
print(queryset) # 4 get:有且只有一个查询结果:返回模型类对象
#obj=Book.objects.get(title="python1")
#obj=Book.objects.get(price=200)
obj=Book.objects.get(title="python")
#print(obj.title)
obj.count() # 5 排除方法;按条件排除
# queryset=Book.objects.exclude(price=200)
# 6 queryset.orderby
# queryset=Book.objects.all() # 默认按id排序
# queryset=Book.objects.all().order_by("-price","-id")
# print("queryset",queryset)
# 7 reverse方法
# Book.objects.all().order_by("-price").reverse()
# 8 exists
print(Book.objects.all().exists())
if Book.objects.all().exists():
print("OK") '''
# 9 values
queryset=Book.objects.filter(price=200).values("title","price")
'''
l=[] # queryset()
for obj in queryset:
l.append({
"title":obj.title,
"price":obj.price,
}) [obj1,obj2]
[{"title":"python","price":200},{"title":"linux","price":200}] '''
print(queryset) # <QuerySet [{'title': 'Python', 'price': Decimal('200.00')}, {'title': 'Linux', 'price': Decimal('200.00')}]>
print(queryset.count()) queryset = Book.objects.filter(price=200).values_list("title", "price")
'''
l=[] # queryset()
for obj in queryset:
l.append((obj.title,obj.price)) [obj1,obj2]
[{"title":"python","price":200},{"title":"linux","price":200}] '''
print(queryset) # <QuerySet [('Python', Decimal('200.00')), ('Linux', Decimal('200.00'))]>
print(queryset.count())
# 10 distinct
ret=Book.objects.values("price").distinct()
print(ret) ############ 模糊查询 ###################### # 查询价格大于200的书籍
ret=Book.objects.filter(price__gte=200)
print(ret)
# 查询书籍名称以py开头
ret=Book.objects.filter(title__startswith="py")
ret=Book.objects.filter(title__contains="py")
ret=Book.objects.filter(title__icontains="py")
ret=Book.objects.filter(price__range=[100,500])
ret=Book.objects.filter(price__in=[100,500])
ret=Book.objects.filter(pub_date__year=2012,pub_date__month=12) #3 删除 #Book.objects.all().delete()
#Book.objects.filter(price=200).delete()
# book=Book.objects.get(id=3)
# book.delete() #4 修改
Book.objects.all().update(price=600,pub_date="2011-11-11") '''
queryset的可调用方法:
queryset.count()
queryset.filter() # 返回的queryset对象
queryset.order_by() # 返回的queryset对象
queryset.reverse() # 返回的queryset对象
queryset.values() # 返回的queryset对象
queryset.values_list() # 返回的queryset对象
queryset.exists # 返回的布尔值
queryset.delete() # 返回的布尔值
'''
return HttpResponse("查询成功")

###################浓缩版数据库操作在视图函数vies.py中完成##################

二 表记录操作

(1) 添加记录
# 方式1
book=Book(title="",price="",publish="",pub_date="2012-12-12")
book.save()
# 方式2
book=Book.objects.create(title="",price="",publish="",pub_date="2012-12-12")
print(book.id)
print(book.title)

(2) 查询记录
KEY:queryset数据类型

Book.objects.all() # 返回queryset对象 [obj,obj2,obj3,...]
Book.objects.all()first() # Book模型类对象
Book.objects.all().last() # Book模型类对象
Book.objects.filter(title="python") # 返回queryset对象 [obj,obj2,obj3,...]
Book.objects.get(title="python") # Book模型类对象
Book.objects.exclude(title="python") # 返回queryset对象 [obj,obj2,obj3,...]
Book.objects.all().count() # 返回int
Book.objects.all().order_by("-price")# 返回queryset对象
Book.objects.all().order_by("-price").reverse() # 返回queryset对象
Book.objects.all().exist() # 返回布尔值
Book.objects.all().values("title") # 返回queryset对象 [{"title":""},{"title":""}]
Book.objects.all().values_list("title","price") # 返回queryset对象 [("python",122),("linux",233)]
Book.objects.all().values("price").distinct()

模糊查询:
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__in=[100,200,300])
Book.objects.filter(price__range=[100,200])
Book.objects.filter(title__startswith="py")
Book.objects.filter(title__contains="py")
Book.objects.filter(title__icontains="py")
Book.objects.filter(pub_date__year="2012")

(3) 删除

Book.objects.all().delete()
Book.objects.get(id=1).delete()

(4) 更新
Book.objects.filter(id__gt=5).update(price=100)

作业讲解:
1 查询老男孩出版社出版过的价格大于200的书籍
Book.objects.filter(price__gt=200,publish="老男孩出版社")

2 查询2017年8月出版的所有以py开头的书籍名称
Book.objects.filter(title__icontains="py",pub_date__year=2017,pub_date__month=8).values("title")

3 查询价格为50,100或者150的所有书籍名称及其出版社名称
Book.objects.filter(price__in=[50,100,150]).values("title","publish")

4 查询价格在100到200之间的所有书籍名称及其价格
Book.objects.filter(price__range=[100,200]).values("title","price")

5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
Book.objects.filter(publish="人民出版社").order_by("-price").values("price").distinct()

二 项目运行流程 

1 确定项目需求,实现相应的功能
第一步 先创建模型对数据库进行操作
第二步 创建URL与该URL调用的视图函数之间的映射表
第三部 按照页面的操作对视图函数中对功能进行封装
1 render 对视图函数传递的参数进行渲染
2 redirect 传递队像硬编码 index.html
第四步 在模板文件建立相应的前端页面
2 对项目进行测试其功能

实例1ORM图书管理系统

第一步 创建项目,先创建模型对数据库进行操作
1.使用默认数据库配置文件
from django.db import models

# Create your models here.
class Book(models.Model):
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=32)
price=models.DecimalField(max_digits=5,decimal_places=2)
publish=models.CharField(max_length=32)
pub_date=models.DateTimeField()
def __str__(self):
return self.title
class Mate:
db_table="book"

models.py

第二步 创建URL与该URL调用的视图函数之间的映射表
from django.contrib import admin
from django.urls import path,re_path from book import views
urlpatterns = [
path('admin/', admin.site.urls),
path('books/', views.books),
path('books/add/', views.addbook),
re_path('books/delete/(\d+)', views.delbook),
re_path('^books/edit/(\d+)$', views.editbook),
]

urls.py


第三步 创建视图函数中对数据的操作进行封装
from django.shortcuts import render,HttpResponse,redirect

# Create your views here.
from book import models def books(request): queryset=models.Book.objects.all()
return render(request,"books.html",{"queryset":queryset}) def addbook(request):
if request.method=="POST":
# 方式1
# title=request.POST.get("title")
# price=request.POST.get("price")
# publish=request.POST.get("publish")
# pub_date=request.POST.get("pub_date")
# book=models.Book.objects.create(titles=title,price=price,publish=publish,pub_date=pub_date)
# 方式2
print(request.POST)
data=request.POST.dict()
data.pop("csrfmiddlewaretoken")
book=models.Book.objects.create(**data) # 保证提交键值对的键必须和数据库表字段一致
#return HttpResponse("添加成功")
return redirect("/books/")
else:
return render(request,'addbook.html') def delbook(request,del_id): models.Book.objects.filter(nid=del_id).delete()
return redirect("/books/") def editbook(request,edit_book_id):
if request.method=="GET":
edit_book=models.Book.objects.filter(nid=edit_book_id).first() return render(request,"editbook.html",{"edit_book":edit_book})
else:
title = request.POST.get("title")
price = request.POST.get("price")
publish = request.POST.get("publish")
pub_date = request.POST.get("pub_date")
models.Book.objects.filter(nid=edit_book_id).update(title=title,price=price,publish=publish,pub_date=pub_date) return redirect("/books/")

View.py


第四步 创建静态文件夹static放置Jquery,css,bootstrap样式文件
STATIC_URL = '/static/' # 静态文件的物理路径的别名

STATICFILES_DIRS=[
os.path.join(BASE_DIR,"static") # 静态文件的物理路径
]

setting.py 文件末尾添加配置


第五步 在模板文件夹template下建立相应的前端页面

添加功能页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
</head>
<body>
<h3>添加书籍</h3>
<div class="row">
<div class="col-md-4 col-md-offset-3">
<form action="/books/add/" method="post">
{% csrf_token %}
<div class="form-group">
<label for="title">书籍名称</label>
<input class="form-control" type="text" id="title" placeholder="名称" name="title">
</div>
<div class="form-group">
<label for="price"> 价格</label>
<input class="form-control" type="text" id="price" placeholder="价格" name="price">
</div>
<div class="form-group">
<label for="publish">出版社</label>
<input class="form-control" type="text" id="publish" placeholder="出版社" name="publish">
</div>
<div class="form-group">
<label for="pub_date">出版日期</label>
<input class="form-control" type="date" id="pub_date" placeholder="出版日期" name="pub_date">
</div>
<input type="submit"value="submit" class="btn btn-default pull-right">
</form>
</div>
</div> </body>
</html>

addbook.html

 查看功能页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/static/jquery-3.1.js"></script>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
</head>
<body> <h3>书籍列表</h3> <div class="row">
<div class="col-md-8 col-md-offset-2">
<a href="/books/add/" class="btn btn-primary"> 添加书籍</a>
<table class="table table-striped table-hover">
<thead>
<tr>
<th>ID</th>
<th>书籍名称</th>
<th>价格</th>
<th>出版社</th>
<th>出版日期</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for book in queryset %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ book.title }}</td>
<td>{{ book.price }}</td>
<td>{{ book.publish }}</td>
<td>{{ book.pub_date|date:"Y/m/d" }}</td>
<td>
<a href="/books/delete/{{ book.nid }}">删除</a>
<a href="/books/edit/{{ book.nid }}">编辑</a>
</td>
</tr>
{% endfor %} </tbody>
</table>
</div>
</div> <script>
$("h3").click(function () {
$(this).css("color","red")
})
</script> </body>
</html>

books.html

编辑功能的页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
</head>
<body>
<h3>编辑书籍</h3>
<div class="row">
<div class="col-md-4 col-md-offset-3">
<form action="" method="post">
{% csrf_token %}
<div class="form-group">
<label for="title">书籍名称</label>
<input class="form-control" type="text" id="title" placeholder="名称" name="title" value="{{ edit_book.title }}">
</div>
<div class="form-group">
<label for="price"> 价格</label>
<input class="form-control" type="text" id="price" placeholder="价格" name="price" value="{{ edit_book.price }}">
</div>
<div class="form-group">
<label for="publish">出版社</label>
<input class="form-control" type="text" id="publish" placeholder="出版社" name="publish" value="{{ edit_book.publish }}">
</div>
<div class="form-group">
<label for="pub_date">出版日期</label>
<input class="form-control" type="date" id="pub_date" placeholder="出版日期" name="pub_date" value="{{ edit_book.pub_date|date:'Y-m-d' }}">
</div>
<input type="submit"value="submit" class="btn btn-default pull-right">
</form>
</div>
</div> </body>
</html>

editbook.html

 
 
 

 

Django中ORM简介与单表数据操作的更多相关文章

  1. web框架开发-Django模型层(1)之ORM简介和单表操作

    ORM简介 不需要使用pymysql的硬编码方式,在py文件中写sql语句,提供更简便,更上层的接口,数据迁移方便(有转换的引擎,方便迁移到不同的数据库平台)…(很多优点),缺点,因为多了转换环节,效 ...

  2. Django 学习 之ORM简介与单表操作

    一.ORM简介 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM). 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到 ...

  3. Django之ORM配置与单表操作

    ORM数据库操作流程: 1.    配置数据库(项目同名包中settings.py和__init__.py) 2.    定义类(app包中models.py),执行建表命令(Tools---> ...

  4. Django中ORM外键和表的关系(Django编程-4)

    外键 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的.外键的存在使得ORM框架在处理表关系的时候异常的强大.因此这里我们首先来 ...

  5. mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)

    字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...

  6. Django中ORM创建表关系

    一:django中ORM创建表关系 ORM创建外键关系 1.表与表之间的关系 1.表与表之间的关系 一对多 一对一 多对多 2.操作目标条件: 图书表 出版社表 作者表 作者详情表 3.外键关联 一对 ...

  7. Django中ORM对数据库的增删改查

    Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...

  8. 6月20日 Django中ORM介绍和字段、字段参数、相关操作

    一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...

  9. Django中ORM介绍和字段及其参数

    ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

随机推荐

  1. 模拟ATM的功能

    import java.io.FileReader; import java.io.FileWriter; import java.io.PrintWriter; import java.util.A ...

  2. div等比例缩放-------纯CSS实现自适应浏览器宽度的正方形

    摘自:https://blog.csdn.net/u010513603/article/details/78200207 1.方案一:CSS3 vw 单位 CSS3 中新增了一组相对于可视区域百分比的 ...

  3. 使用隐含参数testMappingSpeed排查GoldenGate抽取慢的步骤

    OGG经典抽取模式读取redo慢的检查步骤,可以采用以下几个步骤来排查. 步骤一,确认是否抽取进程的写入有问题 1. 在原有抽取进程上,执行如下命令,统计抽取进程的效率 GGSCI> stats ...

  4. JS笔记—01

    1.JS的代码一般在头部写2.当页面载入时,会执行位于body部分的JavaScript当被调用时,位于head部分的JavaScript被执行.3.要对外部的JS文件的一个变量操作,代码是写在内部J ...

  5. Centos6下给PHP安装Qconf扩展

    一.下载Qconf的zip包        1.进入github地址:https://github.com/Qihoo360/QConf,下载zip包文件,并上传至服务器二.安装QConf unzip ...

  6. 一元二次方程解法的实现(Python)

    请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程: ax2 + bx + c = 0的两个解. 提示:计算平方根可以调用math.sqrt()函数   # -*- c ...

  7. Lottie的json动画

    我们的设计如是说: Lottie的json动画,优缺点有 优点: 1.开发成本低,动画的还原度高.设计师导出 json 文件后,交付开发.原本要1天甚至更久的动画实现,现在只要不到一小时甚至更少时间了 ...

  8. 数据库 --- 4 多表查询 ,Navicat工具 , pymysql模块

    一.多表查询 1.笛卡儿积 查询 2.连接 语法: ①inner    显示可构成连接的数据 mysql> select employee.id,employee.name,department ...

  9. 第一次参加acm区域赛

    什么,这周天就要去参加acm焦作赛,简直不敢相信.从大一暑假七月份中旬到今天十一月23日,加入acm将近四个多月的时间,如今到了检验自己的时候了.aaaaaaaaaa.乌拉,必胜.打印个模板,在跑个步 ...

  10. Oracle错误——ORA-01940: cannot drop a user that is currently connected

    背景 在oracle删除用户时,有的时候会提示ORA-01940: cannot drop a user that is currently connected,不能够删除用户. 原因 这是因为有其他 ...