django查询
filter:查询满足条件的对象,得到QuerySet,查询结果不存在时,得到QuerySet[]
# 查询年龄等于18的信息
stus = Student.objects.filter(age=18)
exclude: 查询不满足条件的对象, 结果得到QuerySet
# 获取不叫小小明的学生的信息
stus = Student.objects.exclude(name='小小明')
get:获取唯一的满足条件的对象,且查询的条件必须存在如果查询结果多于一个,则报错
# 查询name=xx的学生信息
stu = Student.objects.get(name='小小明')
first() : 获取结果中的第一个
last() : 获取结果中的最后一个
all() : 获取所有
多条件查询:
对象.objects.filter(条件1).filter(条件2) 或者
对象.objects.filter(条件1, 条件2)
# 查询年龄等于18且性别为女的学生信息
stus = Student.objects.filter(age=18).filter(gender=0)
stus = Student.objects.filter(age=18, gender=0)
排序:order_by
对象.objects.order_by(条件):按条件升序
对象.objects.order_by(-条件):按条件降序
# 排序order_by, 降序-id,在SQL中id desc,升序id, 在SQL中 id asc
stus = Student.objects.all().order_by('-id')
是否存在:exists
有值返回True,没有值返回False
# 判断name=王昭君 的学生存不存在, 存在返回True,不存在返回False
stu = Student.objects.filter(name='王昭君').exists()
if stu:
print('1')
else:
print('2')
获取对象的值,结果是字典
# 获取对象的值
stus_value = Student.objects.all().values()
比较运算:
contains:是否包含,大小写敏感
icontains:是否包含,大小写不敏感
startwith,endwith:以values开头或结尾,大小写敏感
# 查询姓名中包含’大‘的学生信息
# 类似于 like '%大%'
stus = Student.objects.filter(name__contains='大')
# 类似于like'%大'
stus = Student.objects.filter(name__endswith='大')
# 类似于like'大%'
stus = Student.objects.filter(name__startswith='大')
__in方法:
# sql:select * from xxx where id in (1,2,3)
stus = Student.objects.filter(id__in=[1, 2])
stus = Student.objects.filter(pk__in=[1, 2])
大于:gt, 大于等于gte
小于:lt, 小于等于lte
stus = Student.objects.filter(age__lte=19)
查询平均年龄
stus = Student.objects.all()
ages = 0
for stu in stus:
ages += stu.age
avg_age = ages / len(stus)
聚合aggregate
avg_age = Student.objects.all().aggregate(Avg('age'))
sum_age = Student.objects.all().aggregate(Sum('age'))
或者条件、非条件、并且条件
查询age=18或者gender=1的学生信息
Q()
from django.db.models import Q
stus = Student.objects.filter(Q(age=18), Q(gender=1))
stus = Student.objects.filter(Q(age=18) & Q(gender=1))
stus = Student.objects.filter(Q(age=18) | Q(gender=1))
stus = Student.objects.filter(~Q(age=18) | Q(gender=1))
查询语文成绩比数学成绩大的学生信息
F()
from django.db.models import F
stus = Student.objects.filter(chinese__gt=F('math'))
# 查询语文成绩比数学成绩大10分的学生信息
stus = Student.objects.filter(chinese__gt=F('math') + 10)
模型的一对一关系以及一对一关系的多表查询
一对一模型的定义:
OneToOne等价于 foreign_key, 且约束unique=True
class StuInfo(models.Model):
phone = models.CharField(max_length=11)
address = models.CharField(max_length=50)
# OneToOne等价于 foreign_key, 且约束unique=True
stu = models.OneToOneField(Student)
class Meta:
db_table = 'stu_info'
verbose_name = '学生信息拓展'
verbose_name_plural = '学生信息拓展'
一对一关系的多表查询:
正向查询:
def sel_info_by_stu(request):
# 通过学生信息查拓展表信息
# 查询大明的电话号码
stu = Student.objects.filter(name='貂蝉').first()
# 第一种方法
# stu_info = StuInfo.objects.filter(stu_id=stu.id).first()
# stu_info = StuInfo.objects.filter(stu=stu).first()
# phone = stu_info.phone
# 第二种方法
stu_info = stu.stuinfo
phone = stu_info.phone
return HttpResponse(phone)
反向查询:
def sel_by_info(request):
# 查询号码为6543210的学生信息
stu_info = StuInfo.objects.get(phone='6543210')
stu = stu_info.stu
name = stu.name
return HttpResponse(name)
常用的方法:
方法 | 用法 |
---|---|
__exact | 精确等于 like ‘aaa’ |
__iexact | 精确等于 忽略大小写 ilike ‘aaa’ |
__contains | 包含 like ‘%aaa%’ |
__icontains | 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。 |
__gt | 大于 |
__gte | 大于等于 |
__lt | 小于 |
__lte | 小于等于 |
__in | 存在于一个list范围内 |
__startswith | 以…开头 |
__istartswith | 以…开头 忽略大小写 |
__endswith | 以…结尾 |
__iendswith | 以…结尾,忽略大小写 |
__range | 在…范围内 |
__year | 日期字段的年份 |
__month | 日期字段的月份 |
__day | 日期字段的日 |
__isnull=True/False | __isnull=True 与 __exact=None的区别 |
返回新的QuerySet的API
方法名 | 解释 |
---|---|
filter() | 过滤查询对象 |
exclude() | 排除满足条件的对象 |
annotate() | 使用聚合函数 |
order_by() | 对查询集进行排序 |
reverse() | 反向排序 |
distinct() | 对查询集去重 |
values() | 返回包含对象具体值的字典的QuerySet |
values_list() | 与values()类似,只是返回的是元组而不是字典 |
dates() | 根据日期获取查询集 |
datetimes() | 根据时间获取查询集 |
none() | 创建空的查询集 |
all() | 获取所有的对象 |
union() | 并集 |
intersection() | 交集 |
difference() | 差集 |
select_related() | 附带查询关联对象 |
prefetch_related() | 预先查询 |
extra() | 附加SQL查询 |
defer() | 不加载指定字段 |
only() | 只加载指定的字段 |
using() | 选择数据库 |
select_for_update() | 锁住选择的对象,直到事务结束 |
raw() | 接收一个原始的SQL查询 |
网友评论