记录操作之增删改查
一、单表
1、 添加记录
准备表
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=20)
price = models.DecimalField(max_digits=65,decimal_places=5)
publish = models.CharField(max_length=30)
pub_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return "%s:%s:%s" %(self.id,self.title,self.price)
添加记录的两种方式
# 方式一
obj=Book.objects.create(title="葵花宝典",price=100,publish="苹果出版社")
# 方式二:
obj=Book(title="九阴真经",price=100,publish="苹果出版社")
obj.save()
添加n条记录为后续操作做准备
Book.objects.create(title="红龙梦",price=300,publish="66出版社")
Book.objects.create(title="钢弹是怎样炼成的",price=10,publish="新华出版社")
Book.objects.create(title="聊斋",price=50,publish="77出版社")
Book.objects.create(title="老女人与海王",price=30,publish="33出版社")
Book.objects.create(title="西游记",price=43,publish="88出版社")
2、单表查询
查询API
<1> all(): 查询所有结果
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
如果符合筛选条件的对象超过一个或者没有都会抛出错误。
<4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
<5> order_by(*field): 对查询结果排序('-id')
<6> reverse(): 对且只对order_by排序的结果进行翻转
<8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
<9> first(): 返回QuerySet集中的第一个对象
<10> last(): 返回QuerySet集中的最后一个对象
<11> exists(): 如果QuerySet包含数据,就返回True,否则返回False
<12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
model的实例化对象,而是一个可迭代的字典序列
<13> values_list(*field): 它与values()非常相似,但返回的是一个元组序列
<14> distinct(): 从返回结果中剔除重复纪录
示例
# QuerySet数据类型(类似于一个列表,里面放着一些对象)
# 1 方法的返回值是什么
# 2 方法的调用者
===============调用者为管理器,返回值为一个记录对象=========
obj = Book.objects.get(title="聊斋")
print(obj) # 结果为:Book object (5)
print(obj.title)
# 若找不到符合条件的记录则报错
Book.objects.get(title="跟Egon学养猪小妙招") # 报错
===============调用者为管理器,返回值为QuerySet=========
# 1、all:
book_list = Book.objects.all()
print(book_list) # 结果是一个QuerySet
print(book_list[0].title)
for obj in book_list:
print(obj.title)
# 2、filter
book_list = Book.objects.filter(title="聊斋") # 相当于where,还可以使用基于双下划线的模糊查询
# 3、exclude
book_list = Book.objects.exclude(title="聊斋") # 除了title="聊斋"之外的都留下来
===============调用者为QuerySet,返回值。。。=========
# 1、count(): 返回的是整型
n = Book.objects.all().count()
print(n) # 7
# 2、first():返回的是一个记录对象
obj = Book.objects.all().first()
print(obj)
print(obj.id) # 1
# 3、last():返回的是一个记录对象
obj = Book.objects.all().last()
print(obj)
print(obj.id) # 7
# 4、exists():返回的是布尔值
res = Book.objects.filter(title="跟Egon老师学算命").exists()
print(res) # False
# 5、order_by(*field):返回的同样是QuerySet
objs = Book.objects.filter(id__lte=6)
print(objs) # QuerySet
print(objs.order_by('price','-id')) # 先按照price字段升序排,若price相同则按照id字段降序排
# 6、reverse():返回的同样是QuerySet
objs = Book.objects.all()
无效
print([obj.id for obj in objs])
print([obj.id for obj in objs.reverse()]) # 顺序与上面保持一致
有效
print([obj.id for obj in objs.order_by('-id')])
print([obj.id for obj in objs.order_by('-id').reverse()]) # 顺序在上面的排序的基础上翻转
# 7、values(*field): 返回的同样是QuerySet
objs = Book.objects.filter(id__gte=3)
print(objs.values("title")) # 返回一个QuerySet
print(objs.values("title")[0]['title']) # 红龙梦
print(objs.values("title").last()['title']) # 西游记
# 8、values_list(*field): 返回的同样是QuerySet
objs = Book.objects.filter(id__gte=3)
print(objs.values_list("title"))
print(objs.values_list("title")[0][0]) # 红龙梦
print(objs.values_list("title").last()[0]) # 西游记
# 9、distinct(): 返回的同样是QuerySet
Book.objects.all().distinct() # 该行代码无意义,因为每一条结果多不是重复的
正确用法如下
objs = Book.objects.all().values("price").distinct()
print(objs)
基于双下划线的模糊查询
Book.objects.filter(price__in=[100,200,300])
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__gte=100)
Book.objects.filter(price__lte=100)
# 等同于Book.objects.filter(id__gte=100,id__lte=200)
# 相当于where price between 100 and 200
Book.objects.filter(price__range=[100,200])
Book.objects.filter(title__contains="python")
Book.objects.filter(title__icontains="python") # 忽略大小写
Book.objects.filter(title__startswith="py")
Book.objects.filter(title__iendswith="py")
Book.objects.filter(pub_date__lte="2021-02-23 17:51:00")
Book.objects.filter(pub_date__minute="38")
3、单表delete
删除delete:调用者只能是QuerySet或者单个一个记录对象
*# 批量删除
objs = Book.objects.filter(id__in=[1,3,5])
objs.delete()
# 删除单一记录
objs = Book.objects.filter(id=6)
obj=objs[0]
obj.delete()
*objs.last().delete()
在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象。例如:
b = Blog.objects.get(pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()
要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用:
Entry.objects.all().delete()
如果不想级联删除,可以设置为:
pubHouse = models.ForeignKey(to=’Publisher’, on_delete=models.SET_NULL, blank=True, null=True)
4、单表update
修改update:调用者只能是QuerySet,返回值为int
objs = Book.objects.filter(id=7)
rows=objs.update(title="xxx")
print(rows)
Book.objects.filter(name='跟Egon学算命').first().update(name='大家多能成神仙') # 报错
update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。
二、多表
准备多对多、一对多、一对一关系如下
from django.db import models
class Book(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish_date = models.DateField(auto_now_add=True)
# 阅读数
# read_num=models.IntegerField(default=0)
# 评论数
# comment_num=models.IntegerField(default=0)
publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE)
authors=models.ManyToManyField(to='Author')
def __str__(self):
return self.name
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
author_detail = models.OneToOneField(to='AuthorDatail',to_field='nid',unique=True,on_delete=models.CASCADE)
class AuthorDatail(models.Model):
nid = models.AutoField(primary_key=True)
telephone = models.BigIntegerField()
birthday = models.DateField()
addr = models.CharField(max_length=64)
class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.EmailField()
生成的表如下:
1、添加记录
查看更多
111