day04 orm简单相关操作

day04 orm简单相关操作

昨日内容复习

  • django主要文件

    mysite项目文件夹
    	mysite同名文件夹
        	settings.py   # 配置文件
             urls.py      # 存放路由和视图函数对应关系 
        应用文件夹(可以有多个)
        	migrations文件夹 # 里面存放ORM针对数据库相关的记录 
            apps.py   # 每个应用的独立标识
            admin.py # django自带的后台管理功能
            views.py # 该app对应的主体功能(函数 类)
            models.py # 与数据库打交道的文件(ORM)
        sqlite3 # django自带的数据库
        manage.py #启动文件
        templates文件夹 #对应的html文件
    
    """
    urls.py		路由层
    views.py	视图层
    templates   模板层
    models.py   模型层
    """
    
  • 小白必会三板斧

    HttpResponse
    	主要返回文本类型的数据
    render
    	主要返回html文件(还支持模板语法)
        render(request,'index.html',{'name':"jason"})
        render(request,'index.html',locals())
    redirect
    	重定向(全称网址、后缀)
    
  • 静态文件资源及配置

    常见静态文件资源
    	css文件 js文件 图片文件 第三方框架文件
    针对静态文件资源也是需要单独存档在某个位置
    	static目录
        	css文件夹
            js文件夹
            img文件夹
            others文件夹
    
    """
    django后端你之所以能够访问到相应的资源是因为提前开设了相应的接口
    	urls.py  路由层
    """
    STATIC_URL = '/static/'  # 接口前缀
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,'static')  # 文件路径
    ]
    静态文件资源动态绑定
    {% load static %}  # 类似于import static
    src={% static 'aaa/a.txt'%}
    
  • 网络请求方法

    # url:统一资源定位符
    GET
    	索要数据
        get请求也可以携带额外的参数但是有大小限制 并且是在url中携带
        	url?xxx=yyy&aaa=bbb
        
    POST
    	提交数据
        post请求一般携带的都是敏感性数据 数据没有大小限制并且存储在请求体
    
  • request对象方法

    request.method  # 纯大写的字符串
    request.POST  # 用户post请求提交的普通数据 
    	.get()
        .getlist()
    request.GET   # 获取url问号后面的数据(不分请求)
    	.get()
        .getlist()
    
  • pycharm链接MySQL

    使用pycharm链接一款之前从来没有链接过的数据库一定要先下载对应的驱动
    针对MySQL的链接pycharm会提供两个驱动 如果一个不行就换另外一个
    
  • django链接MySQL

    1.配置文件中
        DATABASES = {
            ...
            'USER' 'PASSWORD' 'HOST' 'PORT' 'NAME' 'CHARSET' 
        }
    2.针对python3.6及以下解释器还需要添加一个额外的代码
    	import pymysql
        pymysql.install_as_MySQLdb()  # 可以直接点出来 不需要过分记忆
    

今日内容概要

1.django orm简介
2.orm创建表
	两个重要命令数据库迁移命令 反向迁移
3.orm字段增删改查
4.orm记录增删改查
5.orm外键的创建

今日内容详细

1.django orm简介

# 什么是ORM?
	ORM:对象关系映射
# 为什么要用ORM?
	能够让不会写SQL语句的python程序员 
    使用面向对象的语法即可简单快捷的操作MySQL,极大地提升开发效率
	'''但是ORM有时候自动生成的SQL效率可能会很低'''--------		表
对象	--------	 一行行记录
对象点属性  -----   记录某个字段对应的值
# 如何使用ORM?
	在django应用文件夹下的models.py中操作
  
"""orm无法创建库 需要自己提前创建好"""

2.orm创建表

1.先在modles.py 创建类相关代码
class Lol(models.Model):  #create table Lol
    id = models.AutoField(verbose_name='编号',primary_key=True)  # id int primary key auto_increment comment '编号'
    name=models.CharField(verbose_name='姓名',max_length=32) #name varchar(32) comment '姓名'
    pwd=models.IntegerField(verbose_name='密码') #pwd int comment '密码'
    # verbose_name ==comment 可以省略其实 
#写完这个发现数据库db123 自动创建了一个 django_migrations 不重要这个就是一个记录表
	django_migrations
2.执行数据库迁移命令(也可以说同步更准确)
	python3 manage.py makemigrations #先记在小本本上migrations
        '''
        Migrations for 'app01':
      	app01\migrations\0001_initial.py
        - Create model Lol
	打开migrations 发现多了一个文件  0001_initial.py  
    	他记录着 操作数据库的记录
    	执行后 不会对数据库有影响 他只是记一下
    	'''
    执行第二条命令 真正操作数据库的
    	python3 manage.py migrate
    
'''
django会有很多app   相同app表名不重复 所以加了一个前缀app的名字 
Lol mysql不区分大小写 表名变层了lol
主键字段orm会自动创建 只不过名字固定为id
CharField字段类型必须要有max_length参数相当于varchar(里面必须指定大小)

   pycharm快捷提示(tools>>>run manage.py task)
'''

在这里插入图片描述

3.orm字段增删改查

增删改查 直接该语句 然后重新迁移数据库就ok了 但是注意如果里面有数据 添加新字段要注意 他不知道原来的数据的新添加的字段的值是多少 
可以通过两种方式解决  添加字段时候设置可以为空 那么之前那个数据的新添加的字段就是null 
第二种方式 添加字段时候 设置default 默认值 之前的

# 当表中已经有数据存在的情况下如果添加新的字段那么需要设置null或者default
password = models.IntegerField(verbose_name='密码',null=True)  # pwd int comment '密码'
age = models.IntegerField('年龄',default=18)

4.orm数据增删改查

from app01 import models ## 导入模块

# 模块名.表名.objects.
models.Lol.objects.all() #等于  selecr * from lol  返回的是 列表套数据对象
	<QuerySet [<Lol: uzi>, <Lol: ming>, <Lol: jacklove>]> # 拿到这个数据对象 可以通过点字段名的方式获取对应字段的值
models.Lol.objects.filter(name='uzi')  #select * from lol where name='uzi' filter=where
	<QuerySet [<Lol: uzi>]>
lol_obj=models.Lol.objects.filter(name='uzi')[0]   得到的死一个数据对象  不加[0]得到的是一个列表套数据对象
lol_obj.name
lol_obj.id
models.Lol.objects.filter(name='uzi',pwd='123') #多个条件查询  and

models.Lol.objects.create(name='doinb',pwd='333')   #insert into lol(name,pwd) values('doinb',333)
	<Lol: doinb> #返回你新增的数据对象本身 可以通过点字段名的方式获取对应字段的值
-----------------------------------------------------------------------------
obj=models.Lol(name='tian',pwd='555')  #这种方式先创建对象     因为类加括号 生成一个对象 这个对象可以直接点字段名的方式获取对应字段的值  产生对象之后 如果写错了 可以直接修改  只要没save 可以多次修改 没有提交到数据库 代码层面的操作
obj.name
	'tian'
#这个方法只是类产生对象  不会加到mysql 里  如果想加到mysql里需要
obj.save() #保存到数据库

models.Lol.objects.filter(id='5').delete()   #filter = where 一定要写 不然这个表全部删除
	(1, {'app01.Lol': 1}) #返回受影响的行

#傻瓜操作  先查询处理 在修改
edit_obj = models.Lol.objects.filter(id=3)[0]
edit_obj.name = 'ning'
edit_obj.save()

models.Lol.objects.filter(name='uzi').update(name='uzi666') 
	1  #返回受影响的行数

5.小练习

中文概念版

	#首页
1.去settings 里配置 
	app注册 
    把tmeplates加入到全局
    配置一下DATABASES
 	静态文件路径配置
2.models模型层里添加表 
3.设置urls  添加数据展示页
4.设置views  添加对应函数(首页) 记得先导入三板斧
	4.1查询表全部数据
    4.2将数据传给前端 前端用bootstrap设置好看一点 传给他一个queryset 列表套数据格式
    4.3前端通过传过来的数据 展示在前端

	#注册
1.先写对应关系 urls
2.到views视图层里 创建对应视图 return 一个html文件 
3.注册应该是在主界面点一个按钮跳转到注册页面,所以主界面加上一个a标签注册 ,跳转到网址href='/register/' 会在url后面添加一个register 本机:端口/urls里面的
4.修改html文件register.html 两个输入框 设计设计格式 一个注册完成按钮  这个要给后端发送数据 目前要用form 把数据包起来(action 不指定默认传给当前页面,相当于再调一次register方法 ) 记得输入框name指定 不染相当于字典没有key 传不过去,  在register 方法可以通过request.method判断请求等于post怎么做 通过request.POST.get(key)获取post请求传过来的参数,通过name去数据库查询 是否有这个数据 返回一个结果,结果true 有 则用户名已存在   返回false 添加数据 并且重定向 主界面 

	#删除
1.在主界面 屁股后加俩按钮编辑 删除
2.点击删除 应该传给后端主键值  href 应该重定向到 新加的数据删除页后缀 然后get请求传给views删除函数 选择这一行的id 问号xxx=xxx形式传给他 
3.先写urls 数据删除页 
4.views 删除函数
	4.1获取用户需要删除的数据主键值 通过get请求获取他问号后面传给我们的值
    4.2有主键值 直接删除 并重定向home页面
    
    #编辑修改
大体思路:点了编辑之后应该跳转到一个页面 这个页面有编辑的数据 ,编辑完成点击保存 再跳转到主界面
1.新增urls 数据编辑页 和 views  数据编辑函数
2.主页面 新增按钮 get请求 发给后端一个id
3.后端根据这个id获取具体数据记得加first 因为 获取的是列表套数据对象 需要指定索引获取第一个元素 (推荐使用first方法) 不直接指定[0]索引
4.返回给用户一个页面render
    

代码版

#视图层
def home (request):
    obj_list=models.Lol.objects.all() #获取全部数据  obj是一个列表套字典
    return render(request,'home.html',locals())



def register(request):
    if request.method == 'POST':
        username=request.POST.get('username')
        password=request.POST.get('password')
        #先比对用户名是否重复
        is_exits=models.Lol.objects.filter(name=username)
        if is_exits:
            return HttpResponse('用户名已存在')
        #不存在则添加数据
        models.Lol.objects.create(name=username,pwd=password)
        #返回home页面
        return redirect('/home/')


    return render(request,'register.html')
    # return redirect('/register/')
def date_delete(request):
    date_id=request.GET.get('date_id')
    models.Lol.objects.filter(id=date_id).delete()
    return redirect('/home/')

def date_edit(request):
    date_id=request.GET.get('date_id')
    username=request.POST.get('username')
    password=request.POST.get('password')
    if request.method=='POST':
        models.Lol.objects.filter(id=date_id).update(name=username,pwd=password)
        return redirect('/home/')

    obj=models.Lol.objects.filter(id=date_id).first()
    return  render(request,'date_edit.html',locals())

#模型层
from django.db import models

# Create your models here.

class Lol(models.Model):  #create table Lol
    id = models.AutoField(verbose_name='编号',primary_key=True)  # id int primary key auto_increment comment '编号'
    name = models.CharField(verbose_name='姓名',max_length=32) #name varchar(32) comment '姓名'
    pwd = models.IntegerField(verbose_name='密码') #pwd int comment '密码'
    # verbose_name ==comment 可以省略其实
    # age = models.IntegerField(verbose_name='年龄',default=18)
    def __str__(self):
        return self.name

render和redirect 的区别

render
	返回给前端一个html页面 还可以提供模板语法

redirect
	重定向一个网页,比如www.baidu.com  还可以不写全称直接'/index/' 默认会在前面加上本机ip加端口
    指向这个网址 相当于去找这个对应关系 然后找这个函数 执行函数里的

6.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')   #自动关联出版社的主键字段 后面还有参数to_filed='跟哪个自动关联' 不写默认主键
    #多对多 写在查询频率较高的表中
    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)
    #一对一 onetoone
    author_detail=models.OneToOneField(to='AuthorDetail')

class AuthorDetail(models.Model):  #作者详情表
    addr = models.CharField(max_length=32)
    phone=models.BigIntegerField()
#数据库迁移后
多对多自动创建第三张表 也会自动加_id
一对多和,一对一 外键字段创建自动加_id  pycharm他会自动加

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值