查询操作

  • 数据库的查询需要使用管理器对象进行
  • 通过mymodel.objects管理器方法调用查询对象
方法 说明
all() 查询全部记录,返回QuerySet查询对象
get() 查询符合条件的单一记录
filter() 查询符合条件的多条记录
exclude() 查询符合条件外的全部记录

all()方法


  • 使用方法:Asset.objects.all()
from monitor.models import Asset
querys =Asset.objects.all()
for i in querys:
    print("创建日期",i.create_date,"操作系统",i.system)
# 打印结果
创建日期 2021-06-16 13:52:14+00:00 操作系统 Centos7
  • 作用:查询Mymodel中所有的数据等同与数据库中的select * from table,返回QuerySet容器对象,内部存放MyModel实例

可以在模型类中定义__str__方法,字典统一queryset中输出的格式

def __str__(self):
    return "创建日期:%s" "物理机信息:%s"%(self.create_date,self.physics_host)

values()方法

  • 用法:Asset.objects.values()
  • 作用:查询部分列的数据并返回 等同于 select 列1,列2 from table
  • 依旧返回QuerySet只不过里面放的是dict字典
>>> a = Asset.objects.values("create_date")
>>> a
<QuerySet [{'create_date': datetime.datetime(2021, 6, 16, 13, 52, 14, tzinfo=<UTC>)}]>

注意这个时候取回来的值是字典的形式,需要用字典的取值方法

values_list方法


  • 用法:Asset.objects.values_list()

  • 作用:以元组的方式查询结果

  • 返回值:QuerySet容器对象,内部存放的是元组

    • 会将查询出来的数据封装到元组中,在封装到查询集合QuerySet中
>>> a = Asset.objects.values_list("create_date")
>>> a
<QuerySet [(datetime.datetime(2021, 6, 16, 13, 52, 14, tzinfo=<UTC>),)]>

注意这个时候取回来的值是元组的形式,需要用元组的取值方法

取值方法: print(元组名[索引])

order_by方法


  • 用法:Asset.objects.order_by('-列','列')
  • 作用:与all()方法不同,他会用SQL语句的ORDER_BY对查询结果根据某个字段选择性的进行排序,默认是升序格式,降序排列需要在列前增加-表示
>>> a = Asset.objects.order_by("create_date")
>>> b = Asset.objects.values("title").order_by('-price')
>>> print(a.query) # 可以使用这种方式查看发送给MySQL的查询语句

filter()


  • 用法:Asset.objects.filter(属性1=值1,属性2=值2),当多个属性在一起为关系
  • 作用:返回包含此条件的全部数据集
  • 返回值:QuerySet容器对象,内部存放模块实例
# 查询数据库中 create_user为admin的
from monitor.models import Asset
info = Asset.objects.filter(create_user="admin")
for i in info:
    print("查询结果",i.create_date)
# 查询数据库中 create_user为admin的并且系统为Linux的
from monitor.models import Asset
info = Asset.objects.filter(create_user="admin",system="Linux")
for i in info:
    print("查询结果",i.create_date)

exclude()


  • 语法:Asset.objects.exclude(条件)

  • 作用:返回不包含此条件的数据集

# 查询数据库中 create_user为admin的并且系统为Linux以外的服务器信息
from monitor.models import Asset
info = Asset.objects.exclude(create_user="admin",system="Linux")
for i in info:
    print("查询结果",i.create_date)

get()


  • 语法Asset.objects.get(条件)
  • 作用:返回满足条件的唯一一条数据,如果查询结果多于1条则会抛出异常Model.MultipleObjectsReturned异常,如果没有查询出数据则会抛出Model.DoesNotExist异常
from monitor.models import Asset
info = Asset.objects.get(create_user="admin",system="Linux")
for i in info:
    print("查询结果",i.create_date)

查询谓词

  • 定义:做更灵活的条件查询时候需要使用查询谓词
  • 每一个查询谓词是一个独立的查询功能

__exact

  • 等值匹配

info = Asset.objects.filter(id__exact=1) # 等同于 select * from asset where id = 1 

__contains

  • 包含指定值
info = Asset.objects.filter(system__contains='linux') # 等同于 select * from asset where name like '%linux'

__startswith

  • 以xxx开始
info = Asset.objects.filter(system__startswith='linux')

__endswith

  • 以xxx结束
info = Asset.objects.filter(system__endswith='linux')

__gt

  • 大于指定值
info = Asset.objects.filter(id__gt='50') # 等同于select * from asset where id > 50
# __gte:大于等于
# __lt:小于
# __小于等于

__in

  • 查找数据是否在指定范围内
info = Asset.objects.filter(country__in=['中国','北京','河北']) # 等同于 select * from asset where country in ('中国','北京','河北') 

__range

  • 查抄数据是否在指定的区间范围内
info = Asset.objects.filter(age__range=(18,45)) # 等同于 select * from asset where age between 18 and 45