Django的ORM操作

ORM

【一】什么是ORM

  • ORM是一种将对象与关系型数据库之间的映射的技术,主要实现了以下三个方面的功能:
    • 数据库中的表映射为Python中的类
    • 数据库中的字段映射为Python中的属性
    • 数据库中的记录映射为Python中的实例
  • ORM的主要优点是可以减少开发人员编写重复的SQL语句的时间和工作量,并且可以减少由于SQL语句的调整和更改所带来的错误。

【二】Django ORM的优点

  • 与其他ORM框架相比,Django ORM拥有以下优点:
  • 简单易用:Django ORM的API非常简单,易于掌握和使用。
  • 丰富的API:Django ORM提供了丰富的API来完成常见的数据库操作,如增删改查等,同时也支持高级查询和聚合查询等操作。
  • 具有良好的扩展性:Django ORM可以与其他第三方库进行无缝集成,如Django REST framework、Django-Oscar等。
  • 自动映射:Django ORM支持自动映射,开发者只需要定义数据库表的结构,就可以自动生成相应的Python类,从而减少开发过程中的重复代码量。

【三】ORM操作之表操作

【1】定义模型表

  • models.py 文件中定义模型表
from django.db import models


# Create your models here.

# 定义模型类 类名默认即表名,但是后面可以自定义表名
class User(models.Model):
    # 定义表字段,当前字段名为 username , 当前字段类型为字符串类型 , 当前字段约束为最多20个字符
    username = models.CharField(max_length=20)
  • CharField:用于存储字符数据,指定最大长度
  • TextField:用于存储长文本数据,没有长度限制
  • IntegerField:用于存储整数数据
  • FloatField:用于存储浮点数数据
  • BooleanField:用于存储布尔值(True 或 False)
  • DateField:用于存储日期
  • DateTimeField:用于存储日期和时间
  • TimeField:用于存储时间
  • EmailField:用于存储电子邮件地址
  • ForeignKey:用于定义外键关系
  • OneToOneField:用于定义一对一关系
  • ManyToManyField:用于定义多对多关系

【2】数据库迁移

  • 生成迁移文件------将操作记录记录在migrations文件夹
python manage.py makemigrations
  • 迁移记录生效------同步到真正的数据库
python manage.py migrate

【四】ORM操作之数据操作

【1】单表操作

(1)增加

模型表名.objects.create(字段名=字段值)

(2)查询

  • 查询全部:all
模型表名.objects.all()
  • 按指定条件过滤:filter
模型表名.objects.get(筛选字段名=筛选字段值)
  • 按指定条件过滤:get
模型表名.objects.filter(筛选字段名=筛选字段值)
  • 获取到指定字段的数据 values
user_obj = 模型表名.objects.values("字段名1")
  • 获取到指定字段的数据 values_list
user_obj = 模型表名.objects.values_list("字段名1","字段名2")
  • 去重 distinct
user_obj = 模型表名.objects.values("字段名1").distinct()
  • 排序 默认升序
# 升序
user_obj = 模型表名.objects.order_by('字段名1')
# 降序
user_obj = 模型表名.objects.order_by('-字段名1')
# 反转 ------只能对有序的数据进行反转
user_obj = 模型表名.objects.order_by('字段名1').reverse()
  • 统计个数 count
user_obj = 模型表名.objects.count()
  • 剔除结果 exclude
# 将某个数据排出在结果之外
user_obj = 模型表名.objects.exclude(筛选字段名=筛选字段值)
  • 是否存在 exists
user_obj = 模型表名.objects.filter(筛选字段名=筛选字段值).exists()

(3)更改

  • 查询后直接修改
模型表名.objects.filter(筛选字段名=筛选字段值).update(修改字段名=修改字段值)
  • 先查询再修改
obj = 模型表名.objects.get(筛选字段名=筛选字段值)
obj.修改字段名=修改字段值
obj.save()

(4)删除

  • 查询后直接删除
模型表名.objects.filter(筛选字段名=筛选字段值).delete()
  • 先查询再删除
obj = 模型表名.objects.get(筛选字段名=筛选字段值)
obj.delete()

【2】双下划线查询

obj = 模型表名.objects.filter(字段名__gt=条件)
字段名__** 功能
字段名__gt 大于
字段名__gt 大于等于
字段名__lt 小于
字段名__lte 小于等于
字段名__in=(a,b,c,...) 或条件
字段名__range=(a,b) 两个条件之间
字段名__contains 模糊查询(默认区分大小写)
字段名__icontains 忽略大小写
字段名__startswith 以指定条件开头
字段名__endswith 以指定条件/结尾
字段名_time__month 查询时间日期(月)
字段名_time__year 查询时间日期(年)
字段名_time__day 查询时间日期(日)

【3】多表操作

(1)一对多外键的增删改

  • 外键的增加
models.Book.objects.create(title="aa",price=123,publish_id=1)

# 虚拟字段 传对象
publish_obj =models.Publish.objects.filter(pk=2).first()
models.Book.objects.create(title="aa", price=123, publish=publish_obj)
  • 外键的删除
模型表名.objects.get(筛选字段名=筛选字段值)
obj.delete()
  • 外键的修改
#  - 直接写实际字段
models.Book.objects.filter(pk=1).update(publish_id=2)
#  - 虚拟字段
publish_obj =models.Publish.objects.get(pk=1)
models.Book.objects.filter(pk=1).update(publish=publish_obj)

(2)多对多外键的增删改

----多对多 增删改 就是在操作第三张表

  • 外键的增加
book_obj = Book.objects.create(字段名=字段值,..)
book_obj.authors.add(1)
# 可以传多个参数
book_obj.authors.add(2,3)
# 支持参数传对象 - 且支持多个对象
book_obj.authors.add(author_obj)
  • 外键的删除
book_obj = models.Book.objects.filter(pk=1).first()
# 支持多个参数 - 支持多个对象
book_obj.authors.remove(2)
  • 外键的修改
book_obj = models.Book.objects.filter(pk=1).first()
# 括号内必须给一个可迭代对象
# 把 1 删掉 替换成 2
book_obj.authors.set([1, 2])
# 把原来都删掉 , 替换成 3
book_obj.authors.set([3])
# 支持放对象
book_obj.authors.set([author_obj])
  • 外键的修改
# 在第三张表中清除某一本书和作者的绑定关系
book_obj = models.Book.objects.filter(pk=1).first()
# 不要加任何参数
book_obj.authors.clear()
posted @ 2024-04-22 16:38  蓝幻ﹺ  阅读(12)  评论(0编辑  收藏  举报