1、条件查询-方法
filter(条件)
- 语法:MyModel.object.filter(属性1=值1,属性2=值2)
- 作用:返回 包含此条件的全部的数据集
- 返回值:
- QuerySet容器对象,内部存放 MyModel 模型类的实例
- 返回一个list类型的需要循环,下标取值
说明:
语法:MyModel.object.exclude(条件)
- 作用:返回 不包含此条件的全部的数据集
返回值:
语法:MyModel.object.get(条件)
- 作用:返回 满足条件的唯一一条数据
- 说明:该方法只能返回一条数据(模型类的实例)
- 查询结果多余一条数据则抛出 .Model.MultipleObjectsReturned 异常
- 查询无结果 也会报错
2、查询谓词
思考?如何做非等值的过滤查询(如 where id>1)
定义:做更灵活的条件查询时需要使用查询谓词
说明:每一个查询谓词是一个独立的查询功能
2.1、常用查询谓词
谓词 | 作用 | 示例 |
---|---|---|
__exact | 等值匹配 | MyModel.object.filter(id__exact=1) 等同于 select * from mymodel where id = 1 |
__contains | 包含指定值 | MyModel.object.filter(__contains=’w’) 等同于 select * from mymodel where name like ‘%w%’ |
__startswith | 以xxx开头 | |
__endswith | 以xxx结尾 | |
__gt | 大于指定值 | MyModel.object.filter(age__gt=50) 等同于 select * from mymodel where age>50 |
__gte | 大于等于 | |
__lt | 小于 | |
__lte | 小于等于 | |
__in | 查找数据是否在指定范围内 | MyModel.object.filter(country__in=[‘中国’,’日本’,’韩国’]) 等同于 select * from mymodel where country in(‘中国’,’日本’,’韩国’) |
__range | 查找数据是否在指定的区间范围内 | MyModel.object.filter(age__range=(35,50)) 等同于 select * from mymodel where age BETWEEN 35 and 50; |
##### 查询条件 = != > < >= <= and or not in in order by group by
# print(models.Teacher.objects.exclude(name="王老师")) # 不等于
# print(models.Teacher.objects.filter(id__gt=3)) # 大于
# print(models.Teacher.objects.filter(id__gte=3)) # 大于等于
# print(models.Teacher.objects.filter(id__lte=3)) # 小于等于
# print(models.Teacher.objects.filter(id__lt=3)) # 小于
# print(models.Teacher.objects.filter(id__in=[1, 2, 3])) # 在范围里
# print(models.Teacher.objects.exclude(id__in=[1, 2, 3])) # 不在xx里
# print(models.Teacher.objects.filter(name__endswith="张")) # 某个字段以xx结尾
# print(models.Teacher.objects.filter(name__startswith="老师")) # 某个字段以xx开头
# print(models.Article.objects.filter(content__contains="vue")) # like
# print(models.Article.objects.all().order_by('-id')) # 倒序排序
# print(models.Article.objects.filter().order_by('-id'))
# result = models.Article.objects.filter(Q(id=1) | Q(id=2))
# print(result)
# # print("!!!!!!!1",models.Article.objects.raw('select * from user_article'))
# r = models.Article.objects.raw('select * from user_article') # 执行原生的sql
# for i in r:
# print(i)
3、Q对象 “或”
ORM “或”条件查询的使用
from django.db.models import Q # orm “或”条件的使用
result = models.Article.objects.filter(Q(id=1) | Q(id=2)) # id =1 or id =2
print(result)
4、原生数据库操作
Django也可以支持 直接使用SQL语句的方式通信数据库
查询:使用MyModel.object.raw(sql语句)进行数据库查询操作
语法:使用 MyModel.object.raw(sql语句)
返回值:RawQuerySet 集合对象【只支持基础操作,比如循环】
books = models.Book.objects.raw('select * from bookstore_book')
for book in books:
print(book)