Backend - Django ORM 性能优化(Create 新增 & Delete 删除)

目录

批量新增(bulk_create)

方式1:for 循环(搭配的是**Object字典形式)

方式2:列表生成式写法 

方式3:若在create时还需要先进行一些判断取值,则用 for 循环(搭配的是Queryset形式)

批量删除(delete)

第一种:_ _in属性 

第二种:Q对象 (适用于复杂的查询条件)


ORM (Object Relational Mapping)
含义:物件导向(面向对象)
实际理解:代码里的model对应pgadmin的table

Django CRUD 四大事务:增 create   删 delete   改 update   查 read

批量新增(bulk_create)

一旦使用到queryset的update和create時,一定要注意是不是批量执行。

例子:新增书籍封面颜色coverColor

下面是models的设定

# 主表Book的model
class Book(models.Model):
    authorid = models.ForeignKey(Author, related_name="authorId", on_delete=models.CASCADE, limit_choices_to={"active": True}, verbose_name=_("authorName"))
    booktype = models.CharField(verbose_name=_("BookType"), max_length=40)
    coverColor = models.CharField(verbose_name=_("Cover"), max_length=40)
    fontColor = models.CharField(verbose_name=_("Font"), max_length=40)

# 外键表Author的model
class Author(models.Model):
    name = models.CharField(verbose_name=_("authorName"), max_length=40)
    age = models.IntegerField(default=0)
方式1:for 循环(搭配的是**Object字典形式)
add_color_list = ['red', 'Blue',  'Pink']
bulkObjList = list()
for a in add_color_list:
    u_dict = dict()
    u_dict['coverColor'] = a
    u_dict['fontColor'] = 'black'
    bulkObjList.append(models.Book(**u_dict))
if bulkObjList:
    models.Book.objects.bulk_create(bulkObjList)
方式2:列表生成式写法 
bulkObjList = list()
bulkObjList = [models.Book(
                   coverColor = a,
                   fontColor = 'black'
               ) for a  in add_color_list]
if bulkObjList:
   models.Book.objects.bulk_create(bulkObjList)
方式3:若在create时还需要先进行一些判断取值,则用 for 循环(搭配的是Queryset形式)
add_color_list = ['red', 'Blue',  'Pink']
bulkObjList = list()
for a in add_color_list:
    fontCol='red' if a=='red' else 'black' # 有判断语句的情況
    bulkObjList.append(
        models.Book(
            coverColor= a,
            fontColor = fontCol
        )
    )
models.Book.objects.bulk_create(bulkObjList)

批量删除(delete)

第一种:_ _in属性 
models.Book.objects.filter(coverColor__in=['red', 'blue']).delete()
第二种:Q对象 (适用于复杂的查询条件)

Q 对象的三种引用方式:https://mp.csdn.net/mp_blog/creation/editor/131443735

其中一种,利用reduce,动态构建查询条件。

from django.db.models import Q
import operator
from functools import reduce

del_list = [ ['red', 'green'],  ['purple', 'blue'] ]
filterCond = [] # 格式是[<Q: (AND: ('fontColor', 'red'), ('coverColor', 'green'))>, <Q: (AND: ('fontColor', 'purple'), ('coverColor', 'blue'))>]
	
for i in del_list:
	filterCond.append(Q(fontColor=i[1], coverColor=i[2]))

# bookqry结果: <QuerySet [<Book: Book object ('数据结构')>, <Book: Book object ('数据库原理')>]>
bookqry = models.Book.objects.filter(reduce(operator.or_, filterCond))

bookqry.delete() # 因为利用Q对象查到多笔,则delete直接执行批量删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值