• ORM基本操作


    ORM基本操作

    基本操作包括增删改查操作,即(CRUD操作)

    CRUD是指在做计算处理时的增加(Create)、读取查询(Read)、更新Update)和删除(Delete)

    ORM CRUD 核心-> 模型类管理器对象

    每个继承自 models.Model 的模型类,都会有一个 objects 对象被同样继承下来。这个对象叫管理器对象

    数据库的增删改查可以通过模型的管理器实现

    class MyMode1 (models .Mode1) :
    	...
    MyMode1.objects.create(...) # objects 是管理器对象
    
    • 1
    • 2
    • 3
    创建数据

    Django ORM 使用一种直观的方式把数据库表中的数据表示成Python 对象

    创建数据中每一条记录就是创建一个数据对象

    方案1

    MyModel.objects.create(属性1=值1,属性2=值1,...)
     成功: 返创建好的实体对象
     失败: 抛出异常
    
    • 1
    • 2
    • 3

    方案2
    创建MyModel实例对象并调用 save()进行保存

    obj = MyMode1(属性=值,属性=值)
    obj.属性=值
    obj.save()
    
    • 1
    • 2
    • 3

    启动Django shell进行相应的操作(项目代码发生变化时,Django shell要重新启动)

    python3 manage.py shell
    
    • 1
    查询操作
    all()方法
    用法:MyModel.objects.all()
    作用: 查询MyModel实体中所有的数据
    等同于 select * from tabel
    返回值: QuerySet容器对象,内部存放 MyModel 实例
    
    可以在模型类中定义__str__ 方法,自定义QuerySet中的输出格式例如 在Book模型类下定义如下
    def __str__(self):
    	return '%s %s %s%s'(self.title, self.price, self.pub, self.market_price)
    
    values('列1','列2'..)
    用法:MyModel.obiects.values(...)
    作用:查询部分列的数据并返回
    等同于 select 列1,列2 from xxx
    返回值: OuerySet
    返回查询结果容器,容器内存字典,每个字典代表一条数据
    格式为:{'列1':'值1','列2':'值2'}
    
    values list('列1','列2'...)
    用法:MyModel.objects.values list(....)
    作用:返回元组形式的查询结果
    等同于 select 列1列2 from xxx
    返回值: uerySet容器对象,内部存放元组
     会将查询出来的数据封装到元组中,再封装到查询集合OuerySet中
    
    order_by()
    用法:MyModelobjects.order_by('-列','列')
    作用:
    与all()方法不同,它会用SOL 语句的ORDER BY 子句对查询结果进行根据某个字段选择性的进行排序
    说明:
    默认是按照升序排序,降序排序则需要在列前增加-表示
    
    条件查询
    
    filter(条件)
    语法:MyModel.obiects.filter(属性1=值1,属性2=值2)
    作用: 返回包含此 条件的全部的数据集
    返回值:
    QuerySet容器对象,内部存放 MyModel 实例
    说明:
    当多个属性在一起时为”与”关系
    
    exclude(条件)
    语法:MyModel.objects.exclude(条件)
    作用: 返回不包含此 条件的全部的数据集
    
    get(条件)
    语法:MyModel.objects.get(条件)
    作用: 返回满足条件的唯一一条数据
    说明: 该方法只能返回一条数据
    查询结果多余一条数据则抛出ModelMultipleObiectsReturned异常
    查询结果如果没有数据则抛出Model.DoesNotExist异常
    
    查询谓词
    
    定义:做更灵活的条件查询时需要使用查询谓词
    说明:每一个查询谓词是一个独立的查询功能
    __exact:等值匹配
    示例:
    Author.objects.filter(id__exact=1)
    # 等同于select * from author where id = 1
    
    contains:包含指定值
    示例: Author.objects.filter(name__contains='w')
    # 等同于 select * from author where name like %w%
    startswith:以XXX 开始 w%
    endswith:以XXX 结束  %w
    
    __gt:大于指定值
    样例: Author.objects.filer(age__gt=50)
    # 等同于 select * from author where age > 50
    __gte:大于等于
    __lt:小于
    __lte:小于等于
    
    __in:查找数据是否在指定范围内
    样例:
    Author.objects.filter(country__in=['中国',日本',韩国'])
    # 等同于 select * from author where country in ('中国',日本',韩国')
    __range:查找数据是否在指定的区间范围内
    样例:
    # 查找年龄在某一区间内的所有作者
    Author.objects.filter(age__range=(35,50))
    # 等同于 SELECT... WHERE Author BETWEEN 35 and 50;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    更新操作
    更新单个数据
    修改单个实体的某些字段值的步骤
    1.查
    通过 get()得到要修改的实体对象
    2.改
    通过 对象.属性的方式修改数据
    3.保存
    通过对象save()保存数据
    
    批量更新数据
    直接调用OuerySet的update(属性=值) 实现批量修改
    示例
    # 将 id大于3的所有图书价格定为0元
    books = Book.objects.filter(id__gt=3)
    books.update(price=0)
    # 将所有书的零售价定为100元
    books = Book.objects.a11()
    books.update(market_price=100)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    删除操作
    单个数据删除
    步骤
    1.查找查询结果对应的一个数据对象
    2调用这个数据对象的delete(方法实现删除
    try:
    auth = Author.objects.get(id=1)
    auth.deTete()
    except:
    print(删除失败)
    
    批量删除
    步骤
    1查找查询结果集中满足条件的全部QuerySet查询集合对象
    2调用查询集合对象的delete()方法实现删除
    # 删除全部作者中,年龄大于65的全部信息
    auths = Author.objects.filter(age__gt=65)
    auths .delete()
    
    伪删除
    通常不会轻易在业务里把数据真正删掉,取而代之的是做伪删除即在表中添加一个布尔型字段(is_active),默认是True;执行删除时,将欲删除数据的is_active字段置为False
    注意:用伪删除时,确保显示数据的地方,均加了is_active=True的过滤查询
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    深入理解全局变量和实例变量在 Ruby 和 Rails 中的作用
    MMU如何通过虚拟地址找到物理地址?
    java毕业设计木材产销系统的生产管理模块mybatis+源码+调试部署+系统+数据库+lw
    第1章 Java基础(三)
    EureKa详解:微服务发现与注册的利器
    第四节:GitMojo及常用DOS命令
    【eBPF-02】入门:基于 BCC 框架的程序进阶
    GCN 翻译 - 1
    create® 3入门教程-创建Create3 Docker映像
    vscode windows mingw配置
  • 原文地址:https://blog.csdn.net/m0_54382779/article/details/133254651