【Django开发入门】如何实现ORM的增删改查和批量操作

这篇具有很好参考价值的文章主要介绍了【Django开发入门】如何实现ORM的增删改查和批量操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原文作者:我辈理想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。


前言

提示:这里可以添加本文要记录的大概内容:

我们都知道Django框架默认是通过ORM来实现数据的增删改查,涉及到的orm方法为create、delete、update、get、filter、all、get_or_create、update_or_create。在Django中还有批量操作,如批量创建和批量更新,涉及到的方法为bulk_create、bulk_update。
本片博客主要结合python数据结构字典,更方便的使用这些方法。

我们应该准备models.py文件,样例如下,详细请看下文。

from django.contrib.gis.db import models
from django.utils import timezone

from django.utils.translation import gettext_lazy as _  # _作为国际化标记,实现中英文翻译


Product_Type = (
    ('0', _('洪水检测')),
    ('1', _('船只提取')),
)
class Product(models.Model):
    user_id = models.IntegerField('在User表中的编号', default=0)
    name = models.CharField("名称", max_length=32, default="")
    type = models.CharField('类型', max_length=20, choices=Product_Type, default='0')
    sort = models.IntegerField(verbose_name='排序', default=0)
    memo = models.CharField(verbose_name='备注', max_length=100, null=True)

    create_time = models.DateTimeField('创建时间', default=timezone.now)
    alter_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)

    class Mate:
        verbose_name = '产品'
        verbose_name_plural = verbose_name

    def __str__(self):
        return str(self.name)

一、创建数据:create或save

(一)save创建

先声明Product类,然后向类中写入内容。

1.每个字段赋值

product = Product()
product.user_id =1
product.name='测试项目'
product.type ='0'
product.save()
# product.save(user_id =1,name='测试项目',type ='0')

2.models类赋值

product = Product(
	user_id =1,
	name='测试项目',
	type ='0'
)
product.save()

(二)create

1.基本创建

Product.objects.create(user_id =1,name='测试项目',type ='0')

2.使用字典创建

在实际web开发中,前后端传输数据多是json格式,通过字典创建数据可以更方便,代码量更少(减少数据转换的过程)。

dict = {
	'user_id':1,
	'name':'测试项目',
	'type':'0',
}
Product.objects.create(**dict)

二、获取一条数据:get

这里id是Product创建时默认的主键,get方法只能获取一条,参数需要是唯一值,否则报错

Product.objects.get(id=1)

三、获取全部数据:all

1.查询

Product.objects.all()

2.切片

Product.objects.all().order_by('id')[0:3]  # 前三条

四、筛选多条数据:filter

1.filter使用

Product.objects.filter(user_id=1)
Product.objects.filter(user_id=1,type ='0')
Product.objects.filter(user_id=1).filter(type ='0')
Product.objects.filter(user_id=1).first()

2.flter进阶

filter是ORM的常用功能,里面很多参数可以使用,除了直接查询外,还有一些封装的方法可以使用,包括__in、__lte、__gte、__icontains

Product.objects.filter(user_id__in=[1,2,3,4,5])  # 查询1,2,3,4,5这个5个人的Product数据
Product.objects.filter(create_time__gte=datetime.datetime(year=2022,month=12,day=12))  # 查询创建时间在2022年12月12日0点之后的数据
Product.objects.filter(Q(name__icontains='项目') OR Q(memo__icontains='项目'))  # 模糊查询name或memo字段,找出包含‘项目’二字的数据

after = Product.objects.filter(id__lt=id).order_by("-id").first()  # 上一条
next = Solutions.objects.filter(id__gt=id).order_by("id").first()  # 下一条

3.动态查询+模糊查询

在实际web开发中,前后端传输数据多是json格式,通过字典创建数据可以更方便,代码量更少(减少数据转换的过程)。
通过是Q查询,扩展查询能力

dict = {
	'user_id':1,
	'name':'测试项目',
	'create_time__gte':datetime.datetime(year=2022,month=12,day=12)
}

q = Q()
q_name = Q(name__icontains='项目')
q_memo = Q(memo__icontains='项目')
q.add(q_name, 'OR')
q.add(q_memo, 'OR')
Product.objects.filter(**dict).filter(q)

4.聚合查询

django的聚合查询主要是orm的2个方法,aggregate和annotate +values_list或values

基本思路是aggregate是聚合方法,总是进行运算,如果想要获得多样数据需要使用annotate,与values完成分组查询结果是字典,与values_list结果是元组(flat参数将获得列表)。

五、更新数据:save或update

更新数据可以参考创建数据,但需要注意的是更新时的条件和更新的内容。

1.save更新

p = Product.objects.get(id=1)
p.name = '测试项目2'
p.save()

2.update更新

Product.objects.fliter(id=1).update(user_id =1,name='测试项目2',type ='0')

在实际web开发中,前后端传输数据多是json格式,通过字典创建数据可以更方便,代码量更少(减少数据转换的过程)。

dict = {
	'user_id':1,
	'name':'测试项目',
	'type':'0',
}
Product.objects.filter(user_id=1).update(**dict)

六、删除数据:delete

Product.objects.get(id=1).delete()
Product.objects.filter(id=1).delete()

七、批量创建:bulk_create

批量创建4条数据

name_list = ['测试项目1','测试项目2','测试项目3','测试项目4']
create_list = []
for name in name_list:
	product = Product(
		user_id =1,
		name=name,
		type ='0'
	)
	create_list.append(product)
Product.objects.bulk_create(create_list)

八、批量更新:bulk_update

批量修改筛选后的数据,batch_size这里需要注意这个参数,网络上没有详细说怎么用。
通过查看bulk_update源码可以知道batch_size参数会将ORM查询按照batch_size的数量分段,然后执行分段数量的sql修改,假如我们有百万条数据,如果使用update一次更新,底层的sql将太长无法执行,bulk_update的batch_size设置为10000,那么bulk_update将执行100条sql修改语句,保证sql能够正常执行,batch_size根据更新字段的多少调整。

# 将用户1的数据,全部转移至用户2账户下
ps = Product.objects.filter(user_id=1)
for p in ps:
	p.user_id=2
Product.objects.bulk_update(ps,fields=['filepath'], batch_size=1000)

九、嵌套查询

嵌套查询会将orm拼接成一个sql语句,这个很多时候是我们希望的,但需要熟悉查询内容和数据库的相关性能,以下是嵌套查询示例。

inner_qs = Blog.objects.filter(name__contains='Ch').values('name', 'id')
entries = Entry.objects.filter(blog__name__in=inner_qs)

因为orm是惰性的,如果不想使用嵌套,可以使用如下示例:

values = Blog.objects.filter(
        name__contains='Cheddar').values_list('pk', flat=True)
entries = Entry.objects.filter(blog__in=list(values))
# 应为list,会执行2次查询

十、扩展查询

这个针对于不同数据库处理复杂where语句提供扩展查询

Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"})

十一、查询拼接

1.内存拼接

queryset = []
queryset.extend(queryset_1)
queryset.extend(queryset_2)
queryset.extend(queryset_3)

2.数据库拼接

queryset_1.union(queryset_2, queryset_3)

十二、跨表查询优化

orm针对外键提供了跨表查询参数select_related、prefetch_related、Prefetch() 对象。这些是性能提升器,它会导致一个更复杂的查询,但意味着以后使用外键关系不需要数据库查询。

1.select_related只适合ForeignKey和OneToOneField

select_related 使用的是数据库的连表查询INNER JOIN。以下示例中blog是外键。

下边这个示例是2次查询

# Hits the database.
e = Entry.objects.get(id=5)

# Hits the database again to get the related Blog object.
b = e.blog

下边这个示例是1次查询

# Hits the database.
e = Entry.objects.select_related('blog').get(id=5)

# Doesn't hit the database, because e.blog has been prepopulated
# in the previous query.
b = e.blog

2.prefetch_related适合ManyToManyField

prefetch_related大致与select_related 相同,并且在此基础上使用python缓存all查询。

很多次查询

plist = Person.objects.prefetch_related('visitation')
[p.visitation.filter(name__icontains=u"市") for p in plist]

2次查询

plist = Person.objects.prefetch_related('visitation')
[[city for city in p.visitation.all() if u"市" in city.name] for p in plist]

Prefetch对象是prefetch_related的应用。可以将prefetch_related和select_related一起使用。

链锁 prefetch_related 调用将累积预取的查找。清除任何 prefetch_related
prefetch_cleared_qset = qset.prefetch_related(None)

总结

ORM的实际使用还有很多方法,需要按照需求找到对应的方法和方式。文章来源地址https://www.toymoban.com/news/detail-454991.html

到了这里,关于【Django开发入门】如何实现ORM的增删改查和批量操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Django-03】模型常用的增删改查

    表示查询集,是从数据库中获取到的Model集合,集合中每个元素都是我们的Model对象 类似于sql中的where 返回符合要求的一条数据,只返回一条,当未找到数据或者是返回的数据超过一条都会抛出异常,因此需要做异常捕捉处理。一般查询条件用主键id,这唯一对应一条数据。

    2024年02月04日
    浏览(35)
  • 使用Django框架完成用户的增删改查操作

    使用Django框架完成用户的增删改查操作,需要按照以下步骤进行: 创建Django项目: 在命令行中进入项目目录,执行以下命令创建一个新的Django项目: 其中projectname是你的项目名称。 创建应用: 在项目目录下执行以下命令创建一个新的应用: 其中appname是你的应用名称。 配置

    2024年01月18日
    浏览(40)
  • node+vue3+mysql前后分离开发范式——实现对数据库表的增删改查

    大家好,我是yma16,本文分享关于 node+vue3+mysql前后分离开发范式——实现对数据库表的增删改查。 技术选型 前端:vite+vue3+antd 后端:node koa 数据库:mysql koa是一个现代的Node.js框架,可以用来构建Web应用程序。 Vue.js 是一款用于构建用户界面的开源JavaScript框架。Vue.js 3 是 Vu

    2024年02月20日
    浏览(38)
  • Hive基本操作-增删改查和修改库表

    创建数据库 查看数据库 修改数据库属性 删除数据库 新增表 外部表和内部表最大的一个区别是,内部表在删除表的时候,数据会一起被删除,它存储在所属数据库子目录下; 外部表再删除表的时候数据不会被删除,所以外部表更加安全,在工作中也更加常用,存储在指定的

    2024年02月11日
    浏览(33)
  • layui实现(学生)数据的增删改查

    查询 添加: 点击添加按钮: 添加成功! 修改: 点击编辑按钮: 修改信息数据,点击提交: 修改数据成功! 删除: 点击删除按钮: 点击确定,删除成功! 分页: 由于数据有限,选择5条/页,进行分页: 批量删除: 首先勾选想要删除的行,点击批量删除: 删除成功: 补

    2023年04月09日
    浏览(38)
  • spring整合mybatis(实现数据的增删改查)

    一、专业术语解释 1、spring:是分层的Java SE/EE应用full - stack 轻量级开源框架 , 以IoC(控制反转)和AOP(面向切面编程)为内核 ,提供展现层spring MVC 和 spring JDBC等众多企业级应用技术。 2、mybatis:是一个持久层框架。原始连接数据库是通过JDBC的API来操作的,过程繁琐,而 mybati

    2024年02月08日
    浏览(43)
  • C语言基础入门之C语言列表的增删改查与指针链表详解

    在C语言中,列表通常使用数组来实现。数组是一种连续的内存空间,可以存储相同类型的数据。通过下标访问数组元素,可以快速查找和修改数据。 要向列表中添加新元素,可以通过将元素插入到指定位置来实现。首先,需要确保列表有足够的空间来存储新元素。然后,将

    2024年02月07日
    浏览(36)
  • Django后端开发——模型层及ORM介绍

    B站网课:点击蓝色字体跳转 或者复制链接到浏览器打开:https://www.bilibili.com/video/BV1vK4y1o7jH?p=15vd_source=597e21cf34ffcdce468ba00be2177e8a 一般都有python3-dev,没有default-libmysqlclient-dev,需要安装default-libmysqlclient-dev 然后安装mysqlclient 若安装default-libmysqlclient-dev时报错‘pkg-config: not found’

    2024年02月19日
    浏览(109)
  • C语言——单链表实现学生信息的增删改查!!

    主界面展示: 添加学生信息界面:  查询所有学生信息界面:  查询单个学生信息界面: 插入界面:   查看插入状态:  修改界面:     删除界面:   退出界面:

    2024年02月16日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包