day04 orm操作
day04 orm操作
昨日内容回顾
- 小白必会三板斧
- request对象方法
- 静态文件
- 请求方式
- python链接数据库
- django链接数据库
小白必会三板斧
HttpResponse :返回前端浏览器文本
render:返回html文件
render(request,'index.html',{'name_list':[meng,zhang]})
render(request,'index.html',locals())
redirect:重定向
redirect('https://www.baidu.com')
redirect('/index/')
request对象方法
request.method : 获取请求方式(字符纯大写)
request.POST : 获取请求的数据
request.POST.get() # 获取列表最后一个数据
request.POST.getlist() # 获取整个列表
reuqest.GET ;获取get请求url问号后面的是数据
request.GET.get()
reguest.GET.getlist()
静态文件
静态文件:css js img 第三方组件
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
请求方式
get:向别人索要数据
post:向别人提交数据
django链接数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'db1'
'HOST': '127.0.0.1',
'PORT':3306,
'URSE':'root',
'PASSWORD':'123',
'CHARSET':'utf8'
}
import pymysql
pymysql.install_as_MySQLdb()
今日内容概要
- django orm简介
- orm创建表
- orm字段增删改查
- orm记录增删改查
- orm外键的创建
django orm简介
1、什么是OPM?
ORM:对象关系映射
2、为什么要用ORM?
能够让不会写SQL语句的python程序员
使用面向对象的语法即可简单快捷的操作MySQL,极大地提升开发效率
'''但是ORM有时候自动生成的SQL效率可能会很低'''
类 表
对象 一行行记录
对象点属性 记录某个字段对应的值
# 如何使用ORM?
在django应用文件夹下的models.py中操作
"""orm无法创建库 需要自己提前创建好"""
orm创建表
# 强调:只要在models.py中改动了与数据库相关的代码,就必须重新执行迁移命令
1、先在models.py中创建表
1)在models.py创建字段
class User(models.Model): # 相当于create table user
id = models.AutoField(verbose_name='编号',primary_key=True) # 创建主键
name = models.CharField(verbose_name='姓名',max_length=32) # name charvar(32)
pwd = models.IntegerField(verbose_name='密码') # pwd int verbose_name:注释
2)主键字段可以不用创建,orm自动帮你创建一个名为id的主键字段。
# 但是主键字段只能名为id,别的主键字段名称只能自己创建
2、执行数据库迁移命令(在命令行执行)
1)执行迁移命令
python3 manage.py makemigrations # 将改动的记录在migrations文件夹中
# 可能缺少底层文件:pip3 install pillow
2)确认提交给数据库(真正修改数据库)
python3 manage.py migrete
# 迁移命令快捷方式:
pycharm快捷提示 : tools >>> run manage.py task
orm创建注意事项
1、主键字段orm会自动创建 只不过名字固定为id
2、CharField字段类型必须要有max_length参数
3、orm无法创建库,只能操作表层级
字段的增删改查
# 增
# 当表中已经有数据存在的情况下如果添加新的字段那么需要设置null或者default
age = models.IntegerField(verbose_name='年龄',null=True)# 一种是字段为空
gender = models.CharField(verbose_name='性别',max_length=32,default='male') # 一种是设置默认值
# 改
代码层面修改后,在执行数据库迁移命令
# 查
pycharm点database中的表
# 删
把相对应的代码注释掉或者删除。但是注释后代码,对应的列数据也会消失。 # 谨慎删除,无法恢复数据
使用Python Console报错信息
把python/helpers/third_party/thriftpy/_shaded_thriftpy/_compat.py文件出错的地方的代码改为:
if PY3:
args = [len(varnames),
0,
len(varnames),
code.co_stacksize,
code.co_flags,
code.co_code,
code.co_consts,
code.co_names,
varnames,
code.co_filename,
"__init__",
code.co_firstlineno,
code.co_lnotab,
code.co_freevars,
code.co_cellvars]
if sys.version_info >= (3, 8, 0):
#Python 3.8 and above supports positional-only parameters. The number of such
#parameters is passed to the constructor as the second argument.
args.insert(2, 0)
new_code = types.CodeType(*args)
elif JYTHON:
from org.python.core import PyBytecode
数据的增删改查
查询
1、全部查询
models.User.objects.all() # all:拿取全部
2、条件查询
models.User.objects.filter(name='meng') # filter:过滤
models.User.objects.filter(name='meng',password='123') # 多条件查询,逗号相当于and
3、实例化对象查询
user_obj = models.User.objects.filter(name='meng').firle()
user_obj.name
<QuerySet [<User: mengNB6661>, <User: zhang>, <User: liu11>, <User: meng>]>
# QuerySet我们可以简单的理解为是列表套一个个数据对象
增加
1、普通增加
models.User.objects.create(name='gao',password='123')
2、对象增加
obj = models.User(name='li',password='113') # 在没保存之前,不会对数据库进行更改
obj.password = 333 # 没保存之前可以修改数据
obj.save() # 对象调用save方法保存到数据库
修改
1、先查询在修改
cat_obj = models.User.objects.filter(id=3)[0] # 类产生对象
cat_obj.name='liu11' # 对象调用修改
cat_obj.save() # 对象调用save方法保存到数据库
2、直接修改 # 常用
models.User.objects.filter(name='meng').update(name='mengNB')
# update user set name='jasonNB' where name='jason';
删除
1、直接删除
models.User.objects.filter(id=8).delete()
# delete from user where id=5;
orm外键创建
一对多外键关系
"""在orm中 外键字段建在多的一方"""
多对多外键关系
"""在orm中 可以直接写在查询频率较高的表中(自动创建第三张表)"""
一对一外键关系
"""在orm中 直接写在查询频率较高的表中"""
# 一对多
publish = models.ForeignKey(to='Publish')
# 多对多
authors = models.ManyToManyField(to='Author') # 自动创建书籍和作者的第三张关系表
# 一对一
author_detail = models.OneToOneField(to='AuthorDetail')
"""
ForeignKey OneToOneField 会自动给字段加_id后缀
"""
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2)
# 一对多
publish = models.ForeignKey(to='Publish')
# 多对多
authors = models.ManyToManyField(to='Author') # 自动创建书籍和作者的第三张关系表
class Publish(models.Model):
title = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
# 一对一
author_detail = models.OneToOneField(to='AuthorDetail')
class AuthorDetail(models.Model):
addr = models.CharField(max_length=32)
phone = models.BigIntegerField()
数据展示页小练习
首页
def home(request):
# 1.查询user表中的所有数据
user_data = models.User.objects.all()
# 2.将数据利用模板语法传递给html文件
return render(request,'home.html',locals())
注册
def register(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 先比对用户名是否重复
is_exists = models.User.objects.filter(name=username) # 如果有值,代表用户名重复了
if is_exists:
return HttpResponse('用户名已存在')
# 将用户数据写入数据库
models.User.objects.create(name=username,password=password)
# 返回数据展示页面
return redirect('/home/')
return render(request,'register.html',locals())
删除数据
def data_delete(request):
# 获取用户需要删除的唯一标识
delete_id = request.GET.get('delete_id')
# 利用orm删除即可
models.User.objects.filter(id=delete_id).delete() # 先利用条件筛选出来,再删除
# 返回数据展示页
return redirect('/home/')
修改数据
def cat_edit(request):
# 1.获取用户想要修改唯一主键标识
edit_id = request.GET.get('edit_id')
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 修改表数据
models.User.objects.filter(id=edit_id).update(name=username,password=password)
# 返回展示页
return redirect('/home/')
# 2.查询用户想要修改的数据
edit_obj = models.User.objects.filter(id=edit_id).first() # 列表套对象
'''filter取值的结果是一个列表套对象,在取值的情况下推荐用first方法'''
# 3.返回给用户一个编辑页面,上面写好用户编辑的数据
return render(request,'cat_edit.html',locals())
主页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">数据展示页面</h1>
<div class="col-md-8 col-md-offset-2">
<table class="table table-hover table-striped">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>password</th>
<th>others</th>
</tr>
</thead>
<tbody>
{% for user_obj in user_data %}
<tr>
<td>{{ user_obj.id }}</td>
<td>{{ user_obj.name }}</td>
<td>{{ user_obj.password }}</td>
<td>
<a href="/cat_edit/?edit_id={{ user_obj.id}}" class="btn btn-primary btn-xs">编辑</a>
<a href="/data_delete/?delete_id={{ user_obj.id }}" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a href="/register/" class="btn btn-success">用户注册</a>
</div>
</div>
</div>
</body>
</html>
day04 orm操作的更多相关文章
- Python/Django(CBV/FBV/ORM操作)
Python/Django(CBV/FBV/ORM操作) CBV:url对应的类(模式) ##====================================CBV操作============ ...
- python/ORM操作详解
一.python/ORM操作详解 ===================增==================== models.UserInfo.objects.create(title='alex ...
- Django中ORM操作
ORM操作: class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.Ch ...
- Django的ORM操作
ORM操作 select * from tb where id > 1 # 对应关系 models.tb.objects.filter(id__gt=1) models.tb.objects.f ...
- python 外键用法 多对多关系 ORM操作 模板相关
一.app/models中写类(设计表结构) 1.普通类 class A(models.Model): id=modles.AutoField(primary_key=True) name=mode ...
- Django之ORM操作
Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...
- Django之ORM操作(聚合 分组、F Q)
Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作. 键的名 ...
- python第一百零五天 ---Django 基础 路由系统 URL 模板语言 ORM 操作
一 路由系统 URL 1 url(r'^index/',views.index) url(r'^home/', views.Home.as_view()) 2 url(r'^detail-(\d+). ...
- Django ORM 操作 必知必会13条 单表查询
ORM 操作 必知必会13条 import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTIN ...
随机推荐
- hdu 1028 Ignatius and the Princess III(母函数)
题意: N=a[1]+a[2]+a[3]+...+a[m]; a[i]>0,1<=m<=N; 例如: 4 = 4; 4 = 3 + 1; 4 = 2 + 2; 4 = 2 + ...
- Go 日常开发常备第三方库和工具
不知不觉写 Go 已经快一年了,上线了大大小小好几个项目:心态也经历了几轮变化. 因为我个人大概前五年时间写的是 Java ,中途写过一年多的 Python,所以刚接触到 Go 时的感觉如下图: 既没 ...
- python 处理xml 数据
1 import xml.sax 2 import xml.sax.handler 3 4 # python 处理xml 数据 类,将xml数据转化为字典 5 ''' 6 原数据:<?xml v ...
- 记一次 php-fpm 连接 nginx 的错误。
环境: docker 中 centos 镜像下 yum 安装的php,nginx. [root@lnmp1 /]# php -v PHP 7.2.11 (cli) (built: Oct 9 2018 ...
- Linux 文本三剑客之 grep
Linux 系统中一切皆文件. 文件是个文本.可以读.可以写,如果是二进制文件,还能执行. 在使用Linux的时候,大都是要和各式各样文件打交道.熟悉文本的读取.编辑.筛选就是linux系统管理员的必 ...
- docker容器命令(一)
容器命令 创建容器:docker run 参数: -it 交互 -d 后台 –name 容器名 -p 主机端口:容器端口 (主机端口映射到docker端口) docker run --name cen ...
- go struct结构
p.p1 { margin: 0; font: 12px ".PingFang SC"; color: rgba(69, 69, 69, 1) } span.s1 { font: ...
- SpringCloud 2020.0.4 系列之 Stream 消息广播 与 消息分组 的实现
1. 概述 老话说的好:事情太多,做不过来,就先把事情记在本子上,然后理清思路.排好优先级,一件一件的去完成. 言归正传,今天我们来聊一下 SpringCloud 的 Stream 组件,Spring ...
- mysql 数据库中 int(3) 和 int(11) 有区别么???
今天去面试的时候 面试官问到了这个问题:int(3) 和 int(11) 有什么区别?? 当时一听有点蒙,(不知道为什么蒙,后来回来想想可能是觉得考官怎么会问这么简单的问题呢,所以蒙了),当时我的回答 ...
- 【linux系统】java环境搭建
搭建步骤 1.安装java : 上传java安装包到linux系统----- rz jdk-8u202-linux-x64.tar.gz jdk下载地址:https://www.oracle.com/ ...