目录
方式3:若在create时还需要先进行一些判断取值,则用 for 循环(搭配的是Queryset形式)
ORM (Object Relational Mapping)
含义:物件导向(面向对象)
实际理解:代码里的model对应pgadmin的tableDjango 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直接执行批量删除