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. 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 + ...

  2. Go 日常开发常备第三方库和工具

    不知不觉写 Go 已经快一年了,上线了大大小小好几个项目:心态也经历了几轮变化. 因为我个人大概前五年时间写的是 Java ,中途写过一年多的 Python,所以刚接触到 Go 时的感觉如下图: 既没 ...

  3. python 处理xml 数据

    1 import xml.sax 2 import xml.sax.handler 3 4 # python 处理xml 数据 类,将xml数据转化为字典 5 ''' 6 原数据:<?xml v ...

  4. 记一次 php-fpm 连接 nginx 的错误。

    环境: docker 中 centos 镜像下 yum 安装的php,nginx. [root@lnmp1 /]# php -v PHP 7.2.11 (cli) (built: Oct 9 2018 ...

  5. Linux 文本三剑客之 grep

    Linux 系统中一切皆文件. 文件是个文本.可以读.可以写,如果是二进制文件,还能执行. 在使用Linux的时候,大都是要和各式各样文件打交道.熟悉文本的读取.编辑.筛选就是linux系统管理员的必 ...

  6. docker容器命令(一)

    容器命令 创建容器:docker run 参数: -it 交互 -d 后台 –name 容器名 -p 主机端口:容器端口 (主机端口映射到docker端口) docker run --name cen ...

  7. go struct结构

    p.p1 { margin: 0; font: 12px ".PingFang SC"; color: rgba(69, 69, 69, 1) } span.s1 { font: ...

  8. SpringCloud 2020.0.4 系列之 Stream 消息广播 与 消息分组 的实现

    1. 概述 老话说的好:事情太多,做不过来,就先把事情记在本子上,然后理清思路.排好优先级,一件一件的去完成. 言归正传,今天我们来聊一下 SpringCloud 的 Stream 组件,Spring ...

  9. mysql 数据库中 int(3) 和 int(11) 有区别么???

    今天去面试的时候 面试官问到了这个问题:int(3) 和 int(11) 有什么区别?? 当时一听有点蒙,(不知道为什么蒙,后来回来想想可能是觉得考官怎么会问这么简单的问题呢,所以蒙了),当时我的回答 ...

  10. 【linux系统】java环境搭建

    搭建步骤 1.安装java : 上传java安装包到linux系统----- rz jdk-8u202-linux-x64.tar.gz jdk下载地址:https://www.oracle.com/ ...