python+Django框架运用(三)
Django模型
模式指的是根据数据库中数据表的结构来创建出来的class,每一张表到Python中就是一个
class,表中的每一个列,到Python中就是class的一个属性。
在模型中可以完成对数据库的增删改查操作
创建和使用模型 --ORM(对象关系映射)
三大特征:
1、数据表到类的映射
将数据表自动生成一个class类
同时也可以将一个class类自动生成一张数据表
2、数据类型的映射
可以将表中的字段数据类型字段映射到Python中对应的数据类型
反之同样
3、关系映射
在Python中可以将表与表之间的关系映射出来
表与表之间的关系也可以自动映射到Python中的class
数据表之间的关联关系:一对一、一对多、多对多
创建和配置数据库
1、先在数据库中创建一个库(mysql)
create database 库名 default utf8;
2、配置数据库(在Django项目中settings.py中)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #引擎
'NAME': 'myitem', # 库名
'USER': 'laige', # 用户名
'PASSWORD': '', # 密码
'HOST': '172.16.2.178', # 数据库服务器地址
'PORT': 3306, # 端口
}
}
Django中连接Mysql需要依赖于pymysql,在项目主目录中__init__.py增加:
import pymysql
pymysql.install_as_MySQLdb()
编写Models
在应用的models.py文件中定义与数据表对应的class
文件中的每个class类都称为模型类、实体类,每个实体类必须继承自models.Model
from django.db import models # 定义一个实体类Users
class Users(models.Model):
# 对应数据表中name字段,数据类型varchar(20)
name = models.CharField(max_length=20)
# 对应数据表中password字段,数据类型varchar(30)
password = models.CharField(max_length=30)
# 对应数据表中email字段,数据类型varchar(254)
email = models.EmailField()
# 对应数据表中age字段,数据类型int()
age = models.IntegerField()
数据库的同步
在models.py中编写好实体类后,需要同步到数据库中
1.在控制台终端进入项目主目录,执行:
./manage.py makemigrations
作用:将每个应用下的models.pu文件生成一个数据库中间文件,保存在migrations目录
2.继续执行:
./manage.py migrate
作用:将每个应用下的migrations目录中的中间文件同步到数据库中
模型的字段类型与字段选项
常用的字段类型:
BooleanField() -->布尔类型,实际就是数据库中的tinyint(1)类型
CharField() --> 字符串类型
DataField() --> 日期类型
DataTimeField() --> 日期时间类型
EmailField() --> 存放电子邮箱
FloatField() --> 浮点型
ImageField() --> 存放图片路径
IntergerField() --> int整数型
更多的字段类型,参考文档:https://docs.djangoproject.com/en/2.0/ref/models/fields
常用字段选项:
max_length --> 指定最大长度,CharField()必须设置
default --> 设置当前字段的默认值
null --> 指定当前字段是否允许为空,默认是False
更多的字段选项,参考文档:https://docs.djangoproject.com/en/2.0/ref/models/fields
模型中的增删改查
1、增加数据,三种方式:
# 增加数据
def add_views(request):
# 方式一:
# 向author表中新增数据,Author是一个实体类(导入models.py)
# Author.objects.create(names='朱自清', age=80)
Author.objects.create(names='土豆', age=37,email='tudou@163.com')
Author.objects.create(names='净无痕', age=35, email='jing@163.com')
Author.objects.create(names='耳根', age=40, email='ergeng@163.com')
Author.objects.create(names='西红柿', age=50, email='ergeng@163.com')
Author.objects.create(names='唐家三少', age=46, email='ergeng@163.com')
Author.objects.create(names='焖面', age=57, email='ergeng@163.com') # 方式二:
# 创建一个Models对象,通过对象的save()完成增加
obj = Author(names='老舍', age=65)
obj.save() # 使用字典构造对象, 通过save()完成增加
dic = {
'names': '李白',
'age': 35
}
obj = Author(**dic)
obj.save() return HttpResponse('新增成功!')
2、修改数据:
# 修改数据
def update_views(request):
# 修改单个数据(三步)
# 1.通过get()得到要修改的实体对象
# 2.通过实体对象的属性修改属性值
# 3.再通过实体对象的save()保存回数据库
au = Author.objects.get(id=1)
au.names = '一叶知秋'
au.save() # 批量修改数据(慎用)
# 调用查询结果集的update()完成批量修改
Author.objects.all().update(age=18) return HttpResponse('修改成功!')
3、删除数据:
# 删除数据
def delete_views(request, user_id):
# 调用实体对象/查询结果集的 delete()
# 删除单个
# obj = Author.objects.get(id=1)
# obj.delete()
# 删除多个
# Author.objects.all().delete() # obj = Author.objects.get(id=user_id)
# obj.delete() # 逻辑删除
au = Author.objects.get(id=user_id)
au.isActive = False
au.save() # 转发(一次请求)
# return aulist_views(request) # 重定向(重新向指定的url发送请求)
return HttpResponseRedirect('/login/')
4、查看数据:
# 查询数据
def query_views(request):
# 方式一(查询所有):
# 查询表中所有数据,相当于select * from 表名;
auList = Author.objects.all()
print(auList)
# 返回的数据,是一个对象的列表,可以迭代出对象遍历出值
# < QuerySet[ < Author: Author object >, < Author: Author object >, < Author: Author object >] >
for au in auList:
print('作者姓名:', au.names)
print('作者年龄:', au.age) # 方式二(查询指定字段):
# 查询表中部分字段数据,等同于select names,age from 表名;
auList = Author.objects.values('names', 'age')
print(auList)
# 返回的数据是查询的字段(字典,字段名:值)组成的列表
for au in auList:
print('作者姓名:', au['names'], '作者年龄:', au['age']) ############################################# # 数据排序(默认是升序)
# 按照age字段进行排序
auList = Author.objects.order_by('age')
print('#######升序#####')
for au in auList:
print(au.id, au.names, au.age)
# Author.objects.order_by('-id')
# 按照age字段进行降序排序
auList = Author.objects.all().order_by('-age')
print('######降序#######')
for au in auList:
print(au.id, au.names, au.age) #############################################
# 对条件取反,等同于select * from 表名 where not (id=3)
print('######条件取反######')
auList = Author.objects.exclude(id=3)
for au in auList:
print(au.id, au.names, au.age) # 等同于 select * from author where not (id=3 and age=80)
Author.objects.exclude(id=3, age=80) ##############################################
# 根据条件查询部分行(重难点)
# 等同于select * from author where id=1
Author.objects.filter(id=1)
# 等同于select * from author where id=1 and names='老舍'
Author.objects.filter(id=1, names='老舍') # 通过Field Lookup(查询表达式)完成复杂条件的构建
# __exact 表示精确查询
Author.objects.filter(names__exact='朱自清') # __contains 筛选出属性中包含关键字的记录
# 等同于 select * from author where names like '%三少'
auList = Author.objects.filter(names__contains='三少')
print(auList[0].names) # __lt 和 __lte 分别表示筛选出属性值小于和小于等于指定值得记录
# __gt 和 __gte 分别表示筛选出属性值大于和大于等于指定值得记录
# 等同于 select * from author where age < 80
Author.objects.filter(age__lt=80)
# __startswith 筛选出以指定关键字开始的记录
# 等同于 select * from names like '朱%'
Author.objects.filter(names__startswith='朱')
# __endswith 筛选出以指定关键字结尾的记录
# 等同于 select * from names like '%三少'
auList = Author.objects.filter(names__endswith='三少').values('names', 'age')
for au in auList:
print('作家姓名:', au['names'])
print('作家年龄:', au['age']) ##############################################
# 查询只返回一条数据(该函数只适用于返回一条记录时使用)
Author.objects.get(id=1) return HttpResponse('查询成功!')
下面还有几个特殊操作:
1、F操作 和 Q操作
from django.db.models import F, Q def doF_views(request):
# 修改所有人的年龄全部加10岁
# F操作, 在执行操作时获取某列的值(脱离操作无效)
Author.objects.all().update(age=F('age')+10)
return HttpResponseRedirect('/index/') def doQ_views(request):
# Q操作, 在查询条件中实现或(or)的功能
# 等用于 select * from author where (id=8 or age>=50) and isActive=True;
auList = Author.objects.filter(Q(id=8) | Q(age__gte=50), isActive=True)
return render(request, 'index.html', locals())
2、原生数据库操作:
def raw_views(request):
sql = 'select * from index_author where id>=9'
auList = Author.objects.raw(sql) for au in auList:
print(au.names, au.age)
return HttpResponse('Execute raw success!')
ps: 这里补充一点内容,重定向:
意思就是想新的地址发送请求(服务器端)
from django.http import HttpResponseRedirect
return HttpResponseRedirect(url)
未完待续....

python+Django框架运用(三)的更多相关文章
- [Python] Django框架入门
说明:Django框架入门 当前项目环境:python3.5.django-1.11 项目名:test1 应用名:booktest 命令可简写为:python manager.py xxx => ...
- 利用 Python django 框架 输入汉字,数字,字符,等。。转成二维码!
利用 Python django 框架 输入汉字,数字,字符,等..转成二维码! 模块必备:Python环境 + pillow + qrcode 模块 核心代码import qrcode qr = ...
- Python Django框架笔记(三):django工作方式简单说明和创建用户界面
(一) 说明 简单说明下django的工作方式,并举2个例子. (二) Django工作方式 假定我们有下面这些文件 ,这里在前2篇的基础上增加了 templates目录(存放html文件) 和s ...
- Python Django框架笔记(一):安装及创建项目
#推荐一本书<Python核心编程>(适合有一定基础的),美国人Wesley Chun编写的,京东.淘宝应该都有.我是觉得写的很好,详细.简洁.满满的干货,不像有的书整本看完也没什么用. ...
- python django框架(一)
s4day63内容回顾: 1. 安装 2. 创建用户 + 授权 3. 连接 - 数据库 终端创建数据库(字符编码) - 数据表 终端 ORM pymysql create ...)engine=inn ...
- [Python] Django框架入门5——静态文件、中间件、上传图片和分页
说明: 本文主要描述Django其他的内容,涉及静态文件处理.中间件.上传文件.分页等. 开发环境:win10.Python3.5.Django1.10. 一.静态文件处理 在Django项目的静态文 ...
- python django框架+vue.js前后端分离
本文用于学习django+vue.js实现web前后端分离协作开发.以一个添加和删除数据库书籍应用为实例. django框架官方地址:https://www.djangoproject.com/ vu ...
- Python Django框架笔记(六):模板
(一){%%}和{{ }} {% for post in posts %} <a href=""><h2>{{ post.title }}</h2&g ...
- Python Django框架笔记(五):模型
#前言部分来自Django Book (一) 前言 大多数web应用本质上: 1. 每个页面都是将数据库的数据以HTML格式进行展现. 2. 向用户提供修改数据库数据的方法.(例如:注册.发表评 ...
- python Django框架正式准备工作
之前由于不太了解数据库方面的知识,但经过一段时间的web应用的开发学习,成功的用其他框架连接了数据库,并完成了相关操作,数据爬取也初识了,更了解了python这门语言的语法,但路还很长,因此现在才能正 ...
随机推荐
- MAC SVN 基本设置 终端命令
extends:http://www.cnblogs.com/heiniuhaha/archive/2012/07/31/2616493.html 安装XCode后Mac OS X 系统已经内置了sv ...
- Docker 安装Centos,Tomcat,Jdk等相关的自定义(Dockerfile)镜像
一.安装Centos镜像 这里Centos 安装 国内daocloud网站提供的官方镜像 docker pull daocloud.io/library/centos:latest 利用docker ...
- 转利用python实现电影推荐
“协同过滤”是推荐系统中的常用技术,按照分析维度的不同可实现“基于用户”和“基于产品”的推荐. 以下是利用python实现电影推荐的具体方法,其中数据集源于<集体编程智慧>一书,后续的编程 ...
- scrapy-redis的使用与解析
scrapy-redis是一个基于redis的scrapy组件,通过它可以快速实现简单分布式爬虫程序,该组件本质上提供了三大功能: scheduler - 调度器 dupefilter - URL ...
- 170809、 把list集合中的数据按照一定数量分组
/** * @Desc : 切分list位多个固定长度的list集合(我这是业务需要,直接是1w条数据切分) * @Author : RICK * @Params: [historyList] * @ ...
- Ubuntu 16.04 ORB_SLAM2+ROS+usb_cam+AR
Ubuntu 16.04 ORB_SLAM2+ROS+usb_cam+AR 参考博文:http://blog.csdn.net/u79501/article/details/68942174 http ...
- 伸展树(Splay Tree)进阶 - 从原理到实现
目录 1 简介 2 基础操作 2.1 旋转 2.2 伸展操作 3 常规操作 3.1 插入操作 3.2 删除操作 3.3 查找操作 3.4 查找某数的排名.查找某排名的数 3.4.1 查找某数的排名 3 ...
- ZOJ 3777 - Problem Arrangement - [状压DP][第11届浙江省赛B题]
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 Time Limit: 2 Seconds Me ...
- 使用 Python 进行 socket 编程
本文主要参考 https://docs.python.org/3/howto/sockets.html . 本文只讨论 STREAME(比如 TCP) INET(比如 IPv4) socket. 在多 ...
- Elasticsearch 过滤器
序 本文主要记录es的查询过滤的使用. 使用过滤器 过滤器不影响评分,而评分计算让搜索变得复杂,而且需要CPU资源,因而尽量使用过滤器,而且过滤器容易被缓存,进一步提升查询的整体性能. post_fi ...