知识点
增:模型类的管理器方法:create(),模型对象的方法save()
查:模型类的管理器方法:all(),filter(),exclude(),get()
扩展常见的运算符(用于用户查询,删除,更新的条件):gt,gte,it,ite,in,range,exact,contains,icontains,startswith,isstartswith,endswith,iendswith
改:对根据条件查询的结果返回的QuerySet对象(不能是模型对象,即不能使用模型类的管理器的get()方法),进行更新。QuerySet对象的方法:update()
删:对根据条件查询的结果返回的QuerySet对象和模型类对象进行更新。
用于字段与字段之间相互比较的F对象
用于多条件查询的Q对象
使用提醒
1.本文章适PyCharm中成功创建django项目,成功创建应用(这里是blog应用),成功创建模型并与数据库绑定之后的项目。
2.本次展示的代码为了便于演示,均在PyCharm的终端的Django Shell运行。前置步骤如下:
1.在PyCharm项目打开终端(快捷键:alt + F12)。
2.使用命令进入Django Shell :
python manage.py shell
3.将应用(这里是blog应用)中的models.py里面定义的模型导入,如下:(自行类比哈)
# 导入模型类
from blog.models import User
# 导入Q对象和F对象,为后续使用Q,F对象做准备
from django.db.models import Q
from django.db.models import F
测试项目目录结构以及关联的数据表userinfo的字段如下:
数据的增查改删
增 create() save()的使用:
# 向用户表(userinfo)添加数据
def add_user(request):
# 使用模型类的管理器的方法: create()
# 模型类的默认管理器对象:User.objects,使用即可
User.objects.create(id=2, is_del=0, name='李四', password='123456', phone='12345678901', email='[email protected]',
student_id=20240002, describe='帅哥')
# 使用模型对象的方法 save(),即先创建模型类的实例对象,再调用该对象的save()方法保存到数据表
user1 = User(is_del=0, name='王五', password='123456', phone='12345678902'
, email='[email protected]', student_id=20240003, describe='帅哥')
user1.save()
查 all() filter() exclude() get()的使用以及常用运算符:
# 从单表中找到任意数量的记录
def find_user_or_users():
# 常用方法
# 1.全表查询 使用模型类的管理器的方法:all() 结果返回QuerySet对象
all_users = User.objects.all()
print(all_users)
# 2.部分查询 使用模型类的管理器的方法:filter() exclude()
# filter()结果返回满足条件的所有记录的QuerySet对象
# exclude()结果返回zh满足条件的记录之外的所有记录的QuerySet对象
filter_users = User.objects.filter(is_del=0)
exclude_users = User.objects.exclude(is_del=1) # 这个不常用
# Tips:如需要使用多个条件同时满足的查询,直接将每个条件用","分隔开即可,如下
filter_users2 = User.objects.filter(is_del=0, name="张三")
# 3.单条记录查询 使用模型类的管理器的方法:filter() 结果返回单条记录对应的模型对象
user1 = User.objects.get(id=2)
# 常用的运算符基本形式:“属性名称_比较对象=值(这里仅仅是字段与常量值的比较,不包括字段与字段的比较)
# 常用运算符:gt,gte,it,ite,in,range,exact,contains,icontains,startswith,isstartswith,endswith,iendswith)
# 可以实现大于,大于等于,小于,小于等于,是否在指定区间,是否精确相等,是否精确相等(忽略大小写),是否指定字段值开头,是否以指定字段值结尾
# 例如:找到id大于等于1的单条记录
user2 = User.objects.get(id__gte=1)
改 update()的使用:
# 更新数据,一般要先找到符号条件的记录再做更新,故 update() 一般要和查询的方法一起使用。
# 但请注意:管理器的get()方法获得的模型对象,而不是QuerySet对象,故无update()方法
def update_user(request):
# 一个或多个符合条件的记录统一修改相应的字段 使用模型类的管理器的方法:update()
User.objects.filter(id=2).update(is_del=1)
# 以下错误的写法, 管理器的 get() 方法返回的是模型对象,无 update() 方法。
User.objects.get(id=2).update(is_del=0)
# 如要更新单个实例,可用save()方法:先查询,在改属性,最后用save()提交
user = User.objects.get(id=2)
user.is_del = 1
user.save()
删 delete()的使用:
# 删除数据
def delete_user(request):
# 删除数据使用的是对象的方法,包括管理器对象和模型对象,以下两种方式均可以删除
# get()方法删除一条数据
# filter()方法删除多条数据
# tips:删除之后id的连贯性大概率会被破坏,比如id=1,id=2,id=3的3条记录,在删掉id=2的记录后,就只剩下id=1,id=3的记录了
# 查询返回的QuerySet对象,可以调用删除方法,注意与update()方法区分
user1 = User.objects.filter(~Q(id=3) & Q(name="王五"))
user1.delete()
# 查询返回的模型对象,也可以调用删除方法,注意与update()方法区分
user2 = User.objects.get(id=2)
user2.delete()
F对象的使用
用途:之前的条件都是字段与常数值的比较,没有挑战性,使用F对象可实现字段与另一个字段的比较。如下:
# 错误的写法:没有使用F对象
User.objects.get(id__lte=student_id)
# 错误的写法:F对象没有传入一个字符串
User.objects.get(id__lte=F(student_id))
# 正确的写法:'student_id'为表的字段名
User.objects.get(id__lte=F('student_id'))
Q对象的使用
用途:Q对象之间支持与(&),或(|),非运算(~),完成条件的逻辑运算。
语法:Q(属性名__运算符=值),即将查询,更新,删除所传递的一个或多个条件用Q对象包裹起来。如下:
# 报错的写法
user1 = User.objects.filter( id=3 & name="王五")
# 正确的写法
user1 = User.objects.filter( Q(id=3) & Q(name="王五"))
user1 = User.objects.filter( ~Q(id=3) & Q(name="王五")) # 加入取反符号
标签:get,对象,改查,Django,filter,objects,User,mysql,id From: https://blog.csdn.net/Dsx20224673/article/details/143445991