django使用Model.objects获取数据的用法小结
参考:https://blog.csdn.net/weixin_45075031/article/details/123593817
一. 通过MyModel.objects管理器方法调用查询方法
1. MyModel.objects.all()
查询MyModel表中的所有数据,等同于select * from table
返回值:QuerySet容器对象,内部存放MyModel实例, ]>
2. MyModel.objects.values()
查询部分列的数据并返回,等同于select 列1,列2 from table
返回值:QuerySet容器对象,内部存放字典, 每个字典代表一条数据;格式为{‘列1’:值1,‘列2’:值2}
3. MyModel.objects.values_list()
作用:返回元组形式的查询结果,等同于select 列1,列2 from xxx
返回值:QuerySet容器对象,内部存放元组, 会将查询出来的数据封装到元组中,再封装到查询集合QuerySet中, 如果需要将查询结果取出,需要使用索引的方式取值
4. MyModel.objects.order_by()
与all()方法不同, 它会用SQL语句的ORDER BY子句对查询结果进行根据某个字段选择性的进行排序, 默认是按照升序排序,降序排序需要在列前面增加‘-’表示
返回值:QuerySet容器对象,内部存放MyModel实例, 将实例按指定字段进行排序(等同于MyModel.objects.all().order_by(‘列1’))
5. MyModel.objects.filter(属性1=值1,属性2=值2) 多个属性在一起时为“与”关系
返回包含此条件的全部的数据集
返回值:QuerySet容器对象,内部存放MyModel实例
6. MyModel.objects.exclude(条件) 多个属性在一起时为“与”关系
返回不包含此条件的全部的数据集
返回值:QuerySet容器对象,内部存放MyModel实例
7. MyModel.objects.get(条件)
返回满足条件的唯一一条数据,查询结果多余一条数据则抛出Model.MultipleObjectsReturned异常,查询结果如果没有数据则抛出Model.DoesNotExist异常
返回值:QuerySet容器对象,内部存放MyModel实例
8. 查询谓词
查询谓词 | 例子 |
---|---|
__exact | Author.objects.filter(id__exact==1) 等同于select * from author where id = 1 |
__contains | Author.objects.filter(name__contains=‘w’) 等同于select * from author where name like ‘%w%’ |
__startwith | Author.objects.filter(name__startwith=‘w’) 等同于select * from author where name like ‘w%’ |
__endwith | Author.objects.filter(name__endwith=‘w’) 等同于select * from author where name like ‘%w’ |
__gt | Author.objects.filter(age__gt=50) 等同于select * from author where age > 50 |
__gte | Author.objects.filter(age__gte=50) 等同于select * from author where age >= 50 |
__lt | Author.objects.filter(age__lt=50) 等同于select * from author where age < 50 |
__lte | Author.objects.filter(age__lte=50) 等同于select * from author where age <= 50 |
__in | Author.objects.filter(country__in=[‘中国’,‘日本’,‘韩国’]) 等同于select * from author where country in [‘中国’,‘日本’,‘韩国’] |
__range | Author.objects.filter(age__range=(30,50)) 等同于select * from author where author between 35 and 50 |
二. 更新操作
1. 更新单个数据
- 查->通过get()得到要修改的实体对象
- 改->通过对象.属性的方式修改数据
- 保存->通过对象.save()保存数据
2. 批量更新数据,直接调用QuerySet的update(属性=值)实现批量修改
#将id大于3的所有图书价格定位0元
books = Book.objects.filter(id__gt==3)
books.update(price=0)
三. 删除和新建操作
1. 单个数据删除
-
查->查找查询结果对应的一个数据对象
-
删->调用这个数据对象的delete()方法实现删除
auth = Author.objects.get(id=1) auth.delete()
2. 批量删除
-
查->查找查询结果中满足条件的全部QuerySet集合对象
-
删->调用集合对象的delete()删除
#删除年龄≥65的全部信息 auths = Author.objects.filter(age__gt=65) auths.delete()
3. 伪删除
通常不会轻易在业务里把数据真正删掉,取而代之的是做伪删除,即在表中添加一个布尔型字段(is_active、is_delete),默认是True;执行删除时,将要删除数据的(is_active、is_delete)字段值设为False
注意:用伪删除时,确保显示数据的地方,均加了is_active/is_delete=True的过滤查询
4. 新建操作
方法1:MyModel.objects.create(属性1=值1,属性2=值2)
方法2:创建MyModel实例对象,并调用save()进行保存
obj = MyModel()
obj.属性1 = 值1
obj.属性2 = 值2
obj.save() #执行save()后数据才会提交到数据库中
批量添加使用bulk_create()
querysetlist=[]
for i in resultlist:
querysetlist.append(Account(name=i))
Account.objects.bulk_create(querysetlist)
四. F对象和Q对象
1. F对象(标记字段)
- 定义:一个F对象代表数据库中某条记录的字段的信息
from django.db.models import F
f('列名')
- 作用:通常对数据库中的字段值不获取的情况下进行操作, 或者用于类属性(字段)之间的比较
例子1,更新Book实例中,将每本书的零售价上涨10元
# F对象实现
Book.objects.all().update(market_price=F('market_price') + 10) # market_price += 10
#等同于sql语句
UPDATE 'bookstore_book' SET 'market_price' = ('bookstore_book'.'market_price' + 10)
#常规操作实现
books = Book.objects.all()
for book in books:
book.market_price = book.market_price + 10 #先将每本书的售价查询出来,再加上10
book.save()
例子2,文章点赞
# 常规点赞操作
def add_like(request,topic_id):
topic = Topic.objects.get(id = topic_id) #查询出点赞的文章
new_like = topic.like + 1 #取出当前文章的点赞数,并增加1
"""等同于sql语句:update topic set like =1 where id = xxx"""
topic.like = new_like #将增加后的点赞数复制到字段中
topic.save() # 保存
#使用F对象实现
def add_like(request,topic_id):
topic = Topic.objects.get(id = topic_id) #查询出点赞的文章
topic.like = F('like') + 1 #等同于 topic.like += 1
"""等同与mysql 语句: update topic set like = like +1 where id = xxx"""
topic.save()
使用常规方法实现点赞:假设同时有一万条点赞数据进行并行处理,这一万条数据的topic.like查询到的like值都为0,执行new_like = topic.like + 1后like的值都为1,提交到数据库后like的值也是1;
使用F对象实现点赞操作:利用mysql的innodb引擎的行锁功能,在进行数据的写入更新时,别人是操作不了数据的,间接性的上了一把锁,防止数据库多事物并发的问题。(like = like +1都是在like的基础上like+=1,而不是set like = 1)
例子3:对数据库中两个字段的值进行比较,列出哪些书的零售价高于定价
#使用F对象实现
from django.db.models import F
from bookstore.models import Book
books = Book.objects.filter(market_price__gt=F('price'))
"""等同于sql语句:SELECT * FROM 'bookstore_book' WHERE 'bookstore_book'.'market_price' > ('bookstore_book'.'price')"""
for book in books:
print(book.title,'定价:',book.price,'现价:',book.market_price)
2. Q对象(或与非)
-
作用:在条件中用来实现逻辑或 | 、逻辑非~、逻辑与&等操作
-
语法:
from django.db.models import Q Q(条件1) | Q(条件2) #条件1或者条件2成立 Q(条件1) & Q(条件2) #条件1和条件2同时成立 Q(条件1) &~ Q(条件2) #条件1成立且条件2不成立
-
例子
#过滤出定价低于20元或者清华大学出版社出版的全部书籍 Book.objects.filter(Q(price__lt=20) | Q(pub='清华大学出版社')) #逻辑与其实不用Q对象也行,比如找出在线并且某一model的设备数 device.objects.filter(device_detail__online=1, model='IR7XX_EVDO/CDMA').count()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)