首页 > 其他分享 >Django的ORM操作

Django的ORM操作

时间:2024-04-22 16:45:37浏览次数:11  
标签:__ obj objects 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()

标签:__,obj,objects,Django,ORM,表名,操作,字段名
From: https://www.cnblogs.com/unrealqcc/p/18150903

相关文章

  • Django的路由系统
    Django的路由系统【1】URL配置URL调度器|Django文档|Django(djangoproject.com)URL配置(URLconf)就像Django所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段......
  • forms组件
    forms组件【一】介绍Forms组件是用来处理用户提交的数据,并将其转换成Python可处理的数据类型。Forms组件提供了一种简单的方式来定义表单的结构以及验证用户输入的数据。通过使用Forms组件,你可以有效地处理用户输入的数据,包括验证、转换以及显示错误信息。【二】基本使用fro......
  • Django中的ORM框架
    Django中的ORM框架【1】什么是ORMORM是一种将对象与关系型数据库之间的映射的技术,主要实现了以下三个方面的功能:数据库中的表映射为Python中的类数据库中的字段映射为Python中的属性数据库中的记录映射为Python中的实例ORM的主要优点是可以减少开发人员编写重复的SQL语......
  • Django三板斧
    三板斧【1】HttpResponseDjango自带的类,用于构建基本的HTTP响应。当需要直接返回纯文本数据(如JSON格式的数据)或者HTML页面时,可以使用HttpResponse。fromdjango.httpimportHttpResponsefromdjango.utilsimportjsondefindex(request):data={"user......
  • 【pytorch学习】之数据操作
    1数据操作为了能够完成各种数据操作,我们需要某种方法来存储和操作数据。通常,我们需要做两件重要的事:(1)获取数据;(2)将数据读入计算机后对其进行处理。如果没有某种方法来存储数据,那么获取数据是没有意义的。首先,我们介绍n维数组,也称为张量(tensor)。使用过Python中NumPy计算包的读者......
  • delete/声明语句/赋值操作
    deletevarx1={a:1}x1=>{a:1}deletex1=>falsewindow.x2={a:1}x2=>{a:1}deletex2=>truevar声明的全局变量和使用let或const声明的全局变量都不能被delete删除,因为它们都是不可配置的。只有直接在全局对象上设置的属性才可以被delete成功删除。delete运......
  • redis list数据结构操作学习
    转自:https://zhuanlan.zhihu.com/p/765785471.插入元素>rpushmylistA#从右侧插入(integer)1>rpushmylistB(integer)2>lpushmylistfirst(integer)3>lrangemylist0-1//这里使用0-1表示显示所有元素,注意是:0空格-1,0代表第一个元素,-1代表最后......
  • java 调用命令执行操作方法
    /***运行系统命令并返回命令结果*@paramcommand要执行的命令*@return命令执行的结果*/publicstaticStringexecuteCommand(Stringcommand)throwsIOException{StringBuilderoutput=newStringBuilder();//......
  • 很强!4.7k star,推荐一款Python工具,可实现自动化操作!!
    1、介绍在日常工作中,肯定会遇到一些重复性的工作,不管是点击某个按钮、写东西,打印东西,还是复制粘贴拷贝资料之类的,需要进行大量的重复操作。按键精灵大家都听说过,传统的方式,大家可以使用按键精灵将操作录制一遍,形成脚本,剩余的工作让计算机自动循环执行,应对这些重复性的任务。但今......
  • 如何基于Django中的WebSockets和异步视图来实现实时通信功能
    本文分享自华为云社区《结合Django中的WebSockets和异步视图实现实时通信功能的完整指南》,作者:柠檬味拥抱。在现代Web应用程序中,实时通信已经成为了必不可少的功能之一。无论是在线聊天、实时数据更新还是实时通知,都需要通过实时通信技术来实现。Django作为一个强大的Web框架,提......