zoukankan      html  css  js  c++  java
  • 🍖django ORM 简介

    一.django ORM 简介

    1.什么是ORM

    • ORM : 全称 object relational mapping, 对象关系映射
    • 功能 : 通过orm实现使用操作对象的方式来操作数据库中的数据
    • 目的 : 就是为了能够让不懂SQL语句的人通过python面向对象的知识点也能够轻松自如的操作数据库
    • 缺陷 : sql 封装死了, 有时候查询速度很慢

    2.ORM与数据库的映射关系

    ORM                        DB
      类 --------------------> 表
    对象 --------------------> 数据行
    属性 --------------------> 字段
    

    二.ORM的基本使用

    1.创建类(表)

    • 我们的模型类需要写在应用下的 models.py 文件中
    from django.db import models
    
    class Student(models.Model):
        """
        CharField 类型必须设置 max_length 参数
        verbose_name 是对字段的解释,每个字段都有,且是第一个默认形参,所以可以直接在第一个位置实参处写值不需要写verbose_name=
        null=True 允许字段为空
        default=0 设置默认值
        """
        # id int primary key auto_increment;(sql语句效果与下面orm语句相同)
        id = models.AutoField(primary_key=True,verbose_name="主键ID")
        # name varchar(32);
        name = models.CharField(max_length=32,verbose_name="名字")
        # age int;
        age = models.IntegerField(verbose_name="年龄")
        # pwd int;
        pwd = models.IntegerField("密码",null=True)
        is_delete = models.IntegerField(default=0)
    
    • 针对主键字段说明
    如果你不指定主键 那么orm会自动帮你创建一个名为id的主键字段
    如果你想让主键字段名不叫id,儿叫叫uid、sid、pid等其他名字则需要自己手动指定
    

    2.数据库迁移命令

    • 凡是对 models.py 中跟数据库相关的代码进行了更改就必须在项目目录下执行两条命令
    • 这两条命令叫数据库迁移命令, 就比如上面我们创建了一个模型类, 于是我们就要进行这两条命令
    # 1.生成数据库同步脚本, 将数据库修改操作先记录下来(对应应用下的 migrations 文件夹)
    python3 manage.py makemigrations
    
    # 2.真正的数据库迁移操作
    python3 manage.py migrate
    

    image-20210315205131493

    • margrations 文件夹下生成的文件

    image-20210315205329021

    • 再看数据库已经生成了表

    image-20210315210346298

    3.字段的增删改查

    • 增 : 添加字段代码然后迁移数据库即可
    sex = models.CharField('性别',max_length=16)
    height = models.IntegerField('身高cm',null=True)  # 可以为空
    
    • 删 : 注释掉代码然后执行数据库迁移命令即可(删除字段对应的数据也将删除)
    • 改 : 直接改代码然后执行数据库迁移命令即可
    • 查 : 鼠标点点点

    4.数据的增删改查

    • 增加数据
    # 假设获取到用户传入的数据
    username = "shawn"
    userpwd = 123
    userage = 23
    
    # insert into Student(name,age,pwd) values(username,userpwd,age);
    
    # 方式一 : 
    user_obj.models.Student.objects.create(name=username,pwd=passwd,age=userage)
    # 方式二 : 
    user_obj = models.Student(name=username,pwd=passwd,age=userage)
    user_obj.save()
    
    • 查询数据
    # select * from Student where name=usernamr
    
    # 方式一 : 
    user_obj = models.User.objects.filter(name=username)[0]
    # 方式二 : 
    user_obj = models.User.objects.filter(name=username).first()
    # 推荐使用.first(). 但是其内部使用的也是通过索引取值
    
    • 查询所有数据
    # select * from Student;
    
    # 方式一 : 
    user_obj = models.User.objects.filter()
    # 方式二 : 
    user_obj = models.User.objects.all()  # [obj1,obj2,obj3]
    
    • 修改数据
    # 方式一 :
    models.Student.objects.filter(id=edit_id).update(name=username,pwd=password)
    
    # 方式二 : 
    edit_obj = models.Student.objects.filter(id=edit_id).first()
    edit_obj.name = username
    edit_obj.pwd = password
    edit_obj.save()
    
    • 删除数据
    # 直接删除
    models.Student.objects.filter(id=edit_id).delete()
    
    # 公司里删除数据并不会真正的删除, 而是在数据后面加一个字段来标志该数据有没有被删除
    # 例如用 isdelete 字段来标识, 如果 isdelete=0 则未删除,如果 isdelete=1 则表示删除
    

    三.补充

    1.开启多个 django 项目导致页面修改没有变化的情况

    • 例如你在 cmd 命令行开启了一个 django 项目, 在 Pycharm 中又开启了一个项目, 其实一直在运行的是第一个启动起来的项目, 因为 django 默认的端口为 8000, 端口已经被占用, 后面开多少个都是无法启动的
    • 解决方法 : 可以更换端口号

    2.浏览器缓存问题

    • 浏览器对于访问的HTML页面会做缓存, 下次访问是直接使用缓存中的文件, 导致你修改文件后在页面上看不到变化
    • 解决方法 : 打开浏览器 ----> 右击检查 ----> Network ----> 勾选Disable cache

    image-20210315222336405

    四.编写登入验证页面

    1.需求

    • 从数据库中读取数据, 然后对用户身份进行校验
    • 校验成功返回字符串"登入成功"
    • 校验失败再次返回用户登入页面

    2.代码

    • views.py 文件
    from django.shortcuts import render,HttpResponse,redirect
    
    def login_func(request):
        from books import models  # 导入数模型类文件
        username = request.POST.get('username')  # 获取用户输入的用户名
        userpwd = request.POST.get('userpwd')    # 获取用户输入的密码
    
        if request.method == 'POST':
            # 拿到匹配的数据对象, 如果匹配不到则返回 None
            user_obj = models.Student.objects.filter(name=username,pwd=userpwd).first()  
            if user_obj:
                print(user_obj.name,user_obj.pwd,user_obj.age,)  # 可以打印信息查看一下
                return HttpResponse(f'欢迎{user_obj.name}小可爱')
        return render(request,'login.html')  # 匹配不到重新返回登入界面
    

    3.注册功能

    • 注册信息添加到数据库
    • views.py 文件
    from django.shortcuts import render,HttpResponse,redirect
    
    def register_func(request):
        from books import models
        username = request.POST.get('username')
        userpwd = request.POST.get('userpwd')
        userage = request.POST.get('userage')
        
        if request.method == 'POST':
            user_obj = models.Student.objects.filter(name=username).first()  # 判断是否存在该用户
            if not user_obj:
                user_obj = models.Student(name=username, pwd=userpwd, age=userage)  
                user_obj.save()  # 进行用户数据添加并保存
                return HttpResponse(f'{user_obj.name}小可爱注册成功')
        return render(request, "register.html")  # 如果用户存在,则重新返回注册界面
    
  • 相关阅读:
    实验四(作业一:字符串加密)
    实验三“类和对象”动手动脑
    实验三“类和对象”课后作业(追踪已经创建了几个对象)
    递归实验动手动脑题目
    ("X+Y="+X+Y)与(X+Y+"=X+Y")
    Linq To Xml
    代码优先-Code First
    restFul接口设计规范
    四: 使用vue搭建网站前端页面
    三: vue组件开发及自动化工具vue-cli
  • 原文地址:https://www.cnblogs.com/songhaixing/p/14545315.html
Copyright © 2011-2022 走看看