六、模型层
一、配置测试脚本
1. 在某一个应用的test.py中加上下面代码,可在manage.py中复制一部分。
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django1.settings")
import django
django.setup()
2. 新建任意py文件,写入上面代码。
二、queryset对象
1. 能用queryset方法链式操作
res = models.Books.objects.filter(pk=1).filter()
2. 能用‘.queryset’查看结果内部对应的sql语句
三、单表操作之增、删、改
1. 创建数据
a. create方法
from datetime import date
ctime = date.today()
book_obj = models.Books.objects.create(title='红楼梦', publish_date=ctime)
book_obj = models.Books.objects.create(title='三国演义',publish_date='2019-1-1')
b. 利用对象的绑定方法
book_obj = models.Books(title='西游记', price=200.00, publish_date='2000-1-2')
book_obj.save()
2. 修改数据
a. queryset方法
models.Books.objects.filter(pk=1).update(price=111.00)
b. 利用对象
将数据所有字段重写一遍,不推荐使用
book_obj = models.Books.objects.get(pk=1)
book_obj.price = 222.00
book_obj.save()
3. 删除数据
a. queryset方法
models.Books.objects.filter(pk=3).delete()
b. save方法
book_obj = models.Books.objects.get(pk=1)
book_obj.delete()
四、单表查询数据的13条方法。
orm语句的查询默认都是惰性查询,只有在使用数据时才会执行。
1. all()
查询所有,返回queryset对象。
res = models.Books.objects.all()
print(res)
2. filter()
筛选,相当于原生sql语句里的where。支持多个参数,参数之间and关系。返回queryset对象。
res = models.Books.objects.filter(pk=1, title='三国演义')
print(res)
3. get()
筛选,获取对象本身,条件不存在报错,支持一个参数。
res = models.Books.objects.get(pk=1)
print(res)
4. first()
获取queryset中第一个数据对象
res = models.Books.objects.filter(title='西游记').first()
print(res.price)
5. last()
获取queryset中最后一个数据对象
res = models.Books.objects.filter(title='西游记').last()
print(res.price)
6. count()
统计数据个数
num = models.Books.objects.count()
print(num)
7. values()
获取数据对象中指定的字段值,返回queryset对象(列表套字典)
res = models.Books.objects.values('title', 'price')
print(res)
8. values_list()
获取数据对象中指定的字段值,返回queryset对象(列表套元祖)
res = models.Books.objects.values_list('title', 'price')
print(res)
9. order_by()
按照指定字段排序,默认升序,字段前加负号降序
res1 = models.Books.objects.order_by('price')
res2 = models.Books.objects.order_by('-price')
print(res1, res2)
10. reverse()
颠倒顺序,前提是对象已被排序
res = models.Books.objects.order_by('price').reverse()
print(res)
11. exclude()
排除
res = models.Books.objects.exclude(pk=2)
print(res)
12. exist()
判断查询结果是否有值,返回布尔值,没什么用,数据本身自带布尔值。
res = models.Books.objects.filter(pk=2).exists()
print(res)
13. distinct()
去重,容易忽略主键。
res = models.Books.objects.values('title', 'price').distinct()
print(res)
五、单表查询的双下划线查询
1. __gt/__lt
查询大于/小于某一个值的数据
res = models.Books.objects.filter(price__gt=100)
print(res)
2. __gte/__lte
查询大于等于/小于等于某一个值的数据
res = models.Books.objects.filter(price__lte=100)
print(res)
3. __in
查询价格等于100或200的数据
res = models.Books.objects.filter(price__in=[100, 200])
print(res)
4. __range
查询价格在100到200之间的数据,顾头顾尾。
res = models.Books.objects.filter(price__range=(100, 200))
print(res)
5. __year
查询出版年份是2019年的数据
res = models.Books.objects.filter(publish_date__year='2019')
print(res)
6. __month
查询出版月份是1月的数据
res = models.Books.objects.filter(publish_date__month='1')
print(res)
7. __startswith/__endswith
查询名称以‘三’开头/结尾的数据
res = models.Books.objects.filter(title__startswith='三')
print(res)
8. __contains/__icontains
查询名称中包含‘a’字的数据,不忽略/忽略大小写。
res = models.Books.objects.filter(title__contains='a')
print(res)