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()
    
    
posted @ 2022-10-25 15:57  坚强的小蚂蚁  阅读(2015)  评论(0编辑  收藏  举报