搜索
简帛阁>技术文章>django ORM 简介

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")  # 如果用户存在,则重新返回注册界面
1删除文件gitrmfiletxt2忽略跟踪的文件,不删除本地文件忽略已跟踪的文件gitrmcachedfiletxt忽略已跟踪的文件夹gitrmrcacheddirectory
不难。。。删库跑路必备命令sudormrf/rmhelp用法:rm[选项]文件Remove(unlink)theFILE(s)f,forceignorenonexistentfilesandargum
假设有一个项目,项目中的所有文件夹都暂存并已提交,但想在下一次提交时忽略某个文件夹,于是想到在gitignore里把文件夹名称填上,如:Library/,然后每次gitstatus的时候,它依然会显示
rm命令rm命令用于删除一个文件或者目录。语法rm[OPTION][FILE]参数f,force:即使文件属性设为只读也直接删除,不逐一确认,此外忽略不存在的文件,不产生提示。i:删除之前逐一询问确
rm是一个危险的命令,使用的时候要特别当心,尤其对于新手,否则整个系统就会毁在这个命令(比如在/(根目录)下执行rm*rf)。所以,我们在执行rm之前最好先确认一下在哪个目录,到底要删除什么东西,操
面试题你了解大O符号(bigOnotation)么?你能给出不同数据结构的例子么?大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是一个渐进上界。大O符号也可用来描述其他的行为,比如:内存
1大O:数步数数步数为了统一描述,大O不关注算法所用的时间,只关注其所用的步数。数组不论多大,读取都只需1步。用大O记法来表示,就是:O(1)很多人将其读作“大O1”,也有些人读成“1数量级”。一般
find/execrm{}\;find/|xargsrmrf两者都可以把find命令查找到的结果删除,其区别简单的说是前者是把find发现的结果一次性传给exec选项,这样当文件数量较多的时候,就可能
昨天学习了创建文件和目录的命令mkdir,今天学习一下linux中删除文件和目录的命令:rm命令。rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有
这里用到的套件是ext3grep、系统必须默认的安装上e2fsprogslibs13923el5e、2fsprogsdevel13923el5、e2fsprogs13923el5这些软件[root@l