系列文章目录
初识Django
Django ORM表的创建和增删改查
django请求生命周期流程图和路由层
Django视图层,模版层
all():查询所有结果
res = models.Book.objects.all()
print(res)
返回结果是所有queryset对象,queryset支持索引取值
filter(**kwargs):包含了与所筛选条件相匹配的对象
res = models.Books.objects.filter(pk=2,title='jpm')
print(res)
返回结果是queryset对象,pk能够自动定位当前主键字段。
'filter括号内可以存放多个条件,默认是and关系
values(*field):返回一个ValueQuerySet(特殊的Queryset),运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
res = models.Books.object.values('student_is_delete')
print(res)
values可以指定查询字段,结果是Qureyset 列表套字典
values_list(*field):与values()非常相似,它返回的是一个元组序列
res = models.Book.objects.values_list('title','price')
print(res)
'''values_list也可以指定查询的字段 结果QuerySet 列表套元组'''
first()与list():分别获胜queryset第一个和最后一个数据对象
res = modeks.Book.objects.filter().first()
print(res)
print(models.student.objects.order_by('price').reverse().first())
print(models.student.objects.order_by('price').reverse().last())
res = models.Books.objects.all().filter().values('title','price')
print(res)
'''只要是queryset对象 就可以无限制的调用queryset对象的方法'''
get()
res = models.Books.objects.get(pk=100)
print(res)
get方法可以直接获取到数据对象
但该方法当查询条件不存在的时候会直接报错 没有filter好用
exclude():取反 包含的是与所给筛选条件不匹配的对象
res = models.Books.objects.exclude(pk=1)
print(res)
order_by 对查询结果进行排序
res = models.Book.objects.order_by('price')
print(res)
reverse() 对查询结果反向排序,必须提前定义有顺序才可以
print(models.student.objects.order_by('student_age').reverse())
distinct 去重
'''尤其要注意主键字段'''
res = models.Books.objects.all().values('title','price')
print(res)
print(res.distinct())
count() 计数
print(models.student.objects.all().count())
exists(): 判断结果集是否有数据,如果QuerySet包含数据,就返回True,否则返回False
res = models.Books.objects.all().exists()
res1 = models.Books.objects.filter(id=100).exists()
print(res,res1)
create()、update()、delete()、对象.save()
查看SQL语句
1.如果当前对象是queryset那么可以直接点query查找该对象内部SQL语句
2.配置文件(只要执行orm语句都会自动打印SQL语句)
settings.py中
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
单表查询之神奇的双下划线查询
models.Tb1.objects.filter(id__lt=10, id__gt=1)
models.Tb1.objects.filter(id__in=[11, 22, 33])
models.Tb1.objects.exclude(id__in=[11, 22, 33])
models.Tb1.objects.filter(name__contains="ven")
models.Tb1.objects.filter(name__icontains="ven")
models.Tb1.objects.filter(id__range=[1, 3])
类似的还有:startswith,istartswith, endswith, iendswith
date字段还可以:
models.Class.objects.filter(first_day__year=2017)
date字段可以通过在其后加__year,__month,__day等来获取date的特点部分数据
models.Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
models.Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
models.Entry.objects.filter(pub_date__year=2005)
models.Entry.objects.filter(pub_date__year__gte=2005)
models.Entry.objects.filter(pub_date__month=12)
models.Entry.objects.filter(pub_date__month__gte=6)
models.Entry.objects.filter(pub_date__day=3)
models.Entry.objects.filter(pub_date__day__gte=3)
models.Entry.objects.filter(pub_date__week_day=2)
models.Entry.objects.filter(pub_date__week_day__gte=2)
需要注意的是在表示一年的时间的时候,我们通常用52周来表示,因为天数是不确定的,老外就是按周来计算薪资的哦~