Django查询语句 及 F对象与Q对象

本文深入讲解了ORM(对象关系映射)中各种查询方法的应用,包括全数据查询、条件筛选、单条记录获取、排除条件、特定字段选择、排序、去重、数量统计及模糊查询等高级技巧,同时介绍了F对象和Q对象的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询语句

    #查询全部数据 翻译为 select * from user; all()返回值是list
    res = User.objects.all()
    #print(res)
    #分页 0开始位置,2结束位置,注意2不是取几条
    res = User.objects.all()[0,2]
    #print(res)

    #查询限定条件的数据 翻译为 select * from user where username = '新用户123' and逻辑使用多个参数传递
    res = User.objects.filter(username='新用户',password='你好')
    #print(res)

    #只取一条 翻译 select * from user where id = 1
    res_one = User.objects.get(id=1)
    #print(res_one)

    #排除条件  翻译为 select * from user where username != '新用户123'   <>
    res = User.objects.exclude(username='新用户')

    #定制字段显示 翻译为 select password from user where name = '新用户'
    res_s = User.objects.filter(username='新用户').values('password')

    #使用values()方法可以自动将结果集转换成可用模式
    data = User.objects.all().values()
    data = list(data)

    #排序 翻译为 select * from user order by id asc  倒序使用 reverse()
    res = User.objects.filter(username='新用户').order_by("password").reverse()
    #第二种方法 -password降序
    res = User.objects.filter(username='新用户').order_by("-password")

    #去重 翻译为 select distinct(username) from user where username = '新用户'
    res_dis = User.objects.filter(username='新用户').values('username').distinct()
    #print(res_dis)

    #取数量 翻译为 select count(*) from user
    res_count = User.objects.filter(username='新用户').count()
    print(res_count)

    #模糊查询 contains:是否包含。select * from user where name like '%新%'
    例:查询姓名包含'新'的用户。
    User.objects.filter(name__contains='新')

    #startswith、endswith:以指定值开头或结尾
    User.objects.filter(name__startswith='新')

    #isnull:是否为null
    User.objects.filter(name__isnull=True)

    #in:是否包含在范围内
    User.objects.filter(id__in=[1,3,5])

    #比较查询

    gt大于 (greater then)
    gte大于等于 (greater then equal)
    lt小于 (less then)
    lte小于等于 (less then equal)
    例:User.objects.filter(id__gt=2)
  

F对象

之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中。

  • 语法如下:

  • F(属性名) 例:查询阅读量大于等于评论量的图书。

from django.db.models import F
BookInfo.objects.filter(readcount__gt=F(‘commentcount’))
可以在F对象上使用算数运算。

  • 例:查询阅读量大于2倍评论量的图书。

BookInfo.objects.filter(readcount__gt=F(‘commentcount’)*2)

Q对象

多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。

  • 例:查询阅读量大于20,并且编号小于3的图书。

BookInfo.objects.filter(readcount__gt=20,id__lt=3)

  • 或者

BookInfo.objects.filter(readcount__gt=20).filter(id__lt=3)
如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。

  • 语法如下:

Q(属性名__运算符=值)

  • 例:查询阅读量大于20的图书,改写为Q对象如下。

BookInfo.objects.filter(Q(readcount__gt=20))
Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。

  • 例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现

BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3))
Q对象前可以使用~操作符,表示非not。

  • 例:查询编号不等于3的图书。

BookInfo.objects.filter(~Q(id=3))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值