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我们可以简单的理解为是列表套一个个数据对象
增加
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())

主页面




    
    Title
    
    {% load static %}
    


数据展示页面

{% for user_obj in user_data %} {% endfor %}
id name password others
{{ user_obj.id }} {{ user_obj.name }} {{ user_obj.password }} 编辑 删除
用户注册

相关