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

    # -*- coding: utf-8 -*- import wx from modelmngr_frame import MyFrame1 ############################# ...

  2. es聚合查询语法

    {    "size": 0,    "query": {        "bool": {            "filter ...

  3. Springboot+Mybatisplus替换mybatis整合报错Mapped Statements collection does not contain value

    问题一: mybatisPlus完全兼容mybatis,一般来说直接替换掉就可以了,如果mybatis的数据源不能取消创建的话,就注掉mybatisplus的数据源 //@Configurationp ...

  4. 用户登录成功后重新获取新的Session

    HttpSession session = request.getSession();            // 用来存储原sessionde的值            ConcurrentHash ...

  5. LINKERD 2.11 中文实战手册

    1. 将您的服务添加到 Linkerd. 为了让您的服务利用 Linkerd,它们还需要通过将 Linkerd 的数据平面代理注入到它们的 pod 中来进行 网格化 . 2. 自动化的金丝雀发布. 通 ...

  6. 自由导入你的增量数据-根据条件将sqlserver表批量生成INSERT语句的存储过程实施笔记

    文章标题: 自由导入你的增量数据-根据条件将sqlserver表批量生成INSERT语句的存储过程增强版 关键字 : mssql-scripter,SQL Server 文章分类: 技术分享 创建时间 ...

  7. [源码解析] PyTorch分布式(5) ------ DistributedDataParallel 总述&如何使用

    [源码解析] PyTorch 分布式(5) ------ DistributedDataParallel 总述&如何使用 目录 [源码解析] PyTorch 分布式(5) ------ Dis ...

  8. vue中使用echarts,地图上的涟漪特效大小设置

    在使用echarts进行开发大屏时,使用到了地图这个组件 我们会根据返回的值来决定涟漪的大小 这时则使用 其它的value为返回的数组,一般格式为[经度,维度,值] 这样就能动态设置效果的大小了

  9. R数据分析:二分类因变量的混合效应,多水平logistics模型介绍

    今天给大家写广义混合效应模型Generalised Linear Random Intercept Model的第一部分 ,混合效应logistics回归模型,这个和线性混合效应模型一样也有好几个叫法 ...

  10. [hdu6991]Increasing Subsequence

    令$f_{i}$​​表示以$i$​​为结尾的极长上升子序列个数,则有$f_{i}=\sum_{j<i,a_{j}<a_{i},\forall j<k<i,a_{k}\not\i ...