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操作的更多相关文章

  1. Python/Django(CBV/FBV/ORM操作)

    Python/Django(CBV/FBV/ORM操作) CBV:url对应的类(模式) ##====================================CBV操作============ ...

  2. python/ORM操作详解

    一.python/ORM操作详解 ===================增==================== models.UserInfo.objects.create(title='alex ...

  3. Django中ORM操作

    ORM操作: class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.Ch ...

  4. Django的ORM操作

    ORM操作 select * from tb where id > 1 # 对应关系 models.tb.objects.filter(id__gt=1) models.tb.objects.f ...

  5. python 外键用法 多对多关系 ORM操作 模板相关

    一.app/models中写类(设计表结构) 1.普通类 class  A(models.Model): id=modles.AutoField(primary_key=True) name=mode ...

  6. Django之ORM操作

    Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...

  7. Django之ORM操作(聚合 分组、F Q)

    Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作.   键的名 ...

  8. python第一百零五天 ---Django 基础 路由系统 URL 模板语言 ORM 操作

    一 路由系统 URL 1 url(r'^index/',views.index) url(r'^home/', views.Home.as_view()) 2 url(r'^detail-(\d+). ...

  9. Django ORM 操作 必知必会13条 单表查询

    ORM 操作 必知必会13条 import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTIN ...

随机推荐

  1. Docker 添加--insecure-registry 私有镜像仓库

    方法一 [root@k8s-master01]# vi /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd --inse ...

  2. Centos7上安装Ubuntu容器

    1.再次之前我们要先装好docker,在上一篇我已经给出了教程,没有安装好的快去看看吧! 2.这里我们使用的是linux系统,所有在线安装是最简便的方法了.我们可以从国内拉取dockerhub镜像,这 ...

  3. kubernetes常见命令

    kubernetes命令 kubectl get pod --all-namespaces查看pod节点 kubectl delete -n service/pods/deplay 删除指定内容 ku ...

  4. 攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup

    攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup 题目介绍 题目考点 SSTI模板注入漏洞 Writeup 知识补充 模板注入:模板引 ...

  5. 在Express 中获取表单请求体数据

    在Express 中获取表单请求体数据 获取 GET 请求参数 获取 POST 请求体数据 安装 配置 获取 GET 请求参数 Express 内置了一个 API , 可以直接通过 req.query ...

  6. 庆祝dotnet6,fastgithub送给你

    前言 dotnet6正式发布了,fastgithub是使用dotnet开发的一款github加速器,作为开发者,无人不知github,作为github用户,fastgithub也许是你不可或缺的本机工 ...

  7. Flink 实践教程:入门(6):读取 PG 数据写入 ClickHouse

    作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接.亚 ...

  8. Linux(kali)基础设置

    本笔记的友情链接 常用目录介绍 boot 存放启动文件 dev 存放设备文件 etc 存放配置文件 home 普通用户家目录,以/home/$username的方式存放 media 移动存储自动挂载目 ...

  9. 使用.NET5、Blazor和Electron.NET构建跨平台桌面应用

    Electron.NET是一个嵌入了ASP.NET Core的Electron的封装,通过Electron.NET可以构建基于.NET5的跨平台的桌面应用,使得开发人员只需要使用ASP.NET Cor ...

  10. 列生成算法(求解Cutting Stock问题)

    列生成是用于求解大规模线性优化问题的一种算法,其实就是单纯形法的一种形式.单纯性可以通过不断迭代,通过换基变量的操作,最终找到问题的最优解.但是当问题的规模很大之后,变量的个数就会增大到在有限时间内无 ...