Python Web框架 Django - Django查询相关

2018-11-28  本文已影响0人  莫名ypc

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查询
上一篇下一篇

猜你喜欢

热点阅读