Django QuerySet Api 详细介绍

目录

models.py 数据库结构

filter() 筛选

exclude() 排除所给参数中不匹配的实例对象

order_by()  排序

valuse() 返回字典,每一个字典代表一个对象

distinct() 去重复

values_list()  返回的是list 包含元组

dates(field, kind, order='ASC')

all()  查询数据集的所有数据 , 没有参数

select_related()

defer() 、 only()  

and &  和 or |  语法

get()  获取一个

create()  创建一个新的实例

get_or_create()  查询没有,就创建

update_or_create(defaults=None, **kwargs)

bulk_create()

count()  计数

in_bulk(id_list=None, *, field_name='pk')

latest(*fields)  返回数据表中最新的

first()  返回一个值

last() 取最后一个

exists() 判断是否存在 返回bool

update() 更新实列

delete()  删除

exact 

iexact  不区分大小写匹配

contains  包含

icontains 不区分大小写的包含

in  

gt 大于 、gte 大于等于、lt 小于、lte 小于等于

startswith 匹配开头字符串

istartswith 匹配开头字符串

endswith 匹配结束字符串

iendswith 匹配结束字符串

range 范围测试(含)。

date

year

month

day

week

week_day

iso_week_day 

quarter

hour

minute

second

isnull

regex 区分大小写的正则表达式匹配。 ​​​​​​​iregex 不区分大小写的正则表达式匹配

正向关联

方向关联


models.py 数据库结构

from django.db import models
from django.contrib.auth.models import User
# Create your models here.
import datetime

class Adminuser(models.Model):

    user = models.ForeignKey(User,verbose_name='外键auth的User表',on_delete=models.CASCADE)

    class Meta:
        db_table = 'adminuser'

class Userwork(models.Model):

    name = models.CharField(verbose_name='员工姓名',max_length=20)
    phone = models.CharField(verbose_name='员工姓名',max_length=11)
    address = models.CharField(verbose_name='员工姓名',max_length=50)
    level = models.CharField(verbose_name='员工姓名',max_length=30)
    type = models.CharField(verbose_name='员工姓名',max_length=30)

    class Meta:
        db_table = 'userwork'


class Books(models.Model):
    title = models.CharField(verbose_name='书名', max_length=20)
    reader = models.CharField(verbose_name='阅读量', max_length=50)
    CreateTime = models.DateTimeField(verbose_name='出版时间',
                                  default=datetime.datetime.now().strftime('%Y-%m-%d'))

    class Meta:
        db_table = 'Books'


class Heros(models.Model):
    name = models.CharField(verbose_name='名字', max_length=10)
    # get_字段名_display()  获取sex_choices
    sex_choices = [
        (1,'男'),
        (2,'女')
    ]
    sex = models.SmallIntegerField(verbose_name='性别',choices=sex_choices)
    age = models.SmallIntegerField(verbose_name='年龄')
    book = models.ForeignKey(verbose_name='书中人物', to=Books,on_delete=models.CASCADE)
    class Meta:
        db_table = 'Heros'

filter() 筛选

参数中相等的值,返回的是一个列表包含QuerySet对象

user = Userwork.objects.filter(name='张三')
print(user[0].name) # 张三
print(user) # <QuerySet [<Userwork: Userwork object (1)>]>

exclude() 排除所给参数中不匹配的实例对象

user = Userwork.objects.exclude(name='张三')
print(user[0].name)  # 列表中第一列的名字 李四
print(user)  # <QuerySet [<Userwork: Userwork object (2)>, <Userwork: Userwork object (3)>, <Userwork: Userwork object (4)>]>

order_by()  排序

print(user_descending) # <QuerySet [<Userwork: Userwork object (4)>, <Userwork: Userwork object (3)>, <Userwork: Userwork object (2)>, <Userwork: Userwork object (1)>]>
user_ascending = Userwork.objects.filter().order_by() # 升序排列 等价于 user_ascending = Userwork.objects.filter().order_by('id')
print(user_ascending) #<QuerySet [<Userwork: Userwork object (1)>, <Userwork: Userwork object (2)>, <Userwork: Userwork object (3)>, <Userwork: Userwork object (4)>]>
user = Userwork.objects.filter().order_by('?')  # 随机排列
print(user) # <QuerySet [<Userwork: Userwork object (3)>, <Userwork: Userwork object (2)>, <Userwork: Userwork object (4)>, <Userwork: Userwork object (1)>]>

valuse() 返回字典,每一个字典代表一个对象

 user = Userwork.objects.all().values()
print(user)
# < QuerySet[
#     {'id': 1, 'name': '张三', 'phone': '12345678901', 'address': '北京', 'level': '科学院', 'type': '信息科学'},
#     {'id': 2, 'name': '李四', 'phone': '12345678901', 'address': '北', 'level': '科学院', 'type': '经济贸易'},
#     {'id': 3, 'name': '王五', 'phone': '12345678902', 'address': '北京', 'level': '科学院', 'type': '外交'},
#     {'id': 4, 'name': '三三', 'phone': : '12345678904', 'address': '北京', 'level': '科学院', 'type': '政治'}]>
print('')
# 给什么参数,就获取那个字段
user = Userwork.objects.all().values('name')
print(user) # <QuerySet [{'name': '张三'}, {'name': '李四'}, {'name': '王五'}, {'name': '三三'}]>

distinct() 去重复

user = Userwork.objects.order_by().distinct()
print(user) # <QuerySet [{'name': '张三'}, {'name': '李四'}, {'name': '王五'}, {'name': '三三'}]>

values_list()  返回的是list 包含元组

user = Userwork.objects.values_list()
print(user[0][1]) # 张三  获取第一个元组中的第二个元素,也就是name字段
user = Userwork.objects.values_list('name') # 只需要名字
print(user) # <QuerySet [('张三',), ('李四',), ('王五',), ('三三',)]>

dates(field, kind, order='ASC')

返回:它的值是一个 datetime.date 对象的列表,
field 应该是你的模型的 DateField 的名称
kind 应该是``"year"、"month"、"week"`` 或 "day"
    "year" 返回字段的所有不同年份值的列表。
    "month" 返回该字段所有不同年/月值的列表。
    "week" 返回该字段的所有不同年份/星期值的列表。所有日期都是星期一。
    "day" 返回该字段的所有不同年/月/日值的列表。
order,默认为 'ASC',应该是 'ASC' 或 'DESC'。这指定了如何对结果进行排序。
book = Books.objects.dates('CreateTime','day')
print(book)

all()  查询数据集的所有数据 , 没有参数

user = Userwork.objects.all()
print(user) # <QuerySet [<Userwork: Userwork object (1)>, <Userwork: Userwork object (2)>, <Userwork: Userwork object (3)>, <Userwork: Userwork object (4)>]>

select_related()

外键表用 select_related() 进行查询的时候,进行预填充,正向获取主键表的数据,不会在查询数据库,可以提升性能
hero = Heros.objects.get(id=1) # 正常的查询
print(hero.book.title) # 在进入数据库查询一次  >>西游记
hero = Heros.objects.select_related().get(id=1)# 使用select_related查询
print(hero.book.title) # 在内存中获取,不会再进数据库  >>西游记

defer() 、 only()  

分别是 指定推迟加载的字段、指定需要的字段其他字段推迟加载
user = Userwork.objects.only('name')
print(user[0].name)

and &  和 or |  语法

# and &  下面三个都是等价的
user = Userwork.objects.filter(id=1, name='张三')
print(user)  # <QuerySet [<Userwork: Userwork object (1)>]>
user = Userwork.objects.filter(id=1) & Userwork.objects.filter(name='张三')
print(user)  # <QuerySet [<Userwork: Userwork object (1)>]>
from django.db.models import Q
user = Userwork.objects.filter(Q(id=1) & Q(name='张三'))
print(user)  # <QuerySet [<Userwork: Userwork object (1)>]>
# or | 下面两个都是个等价的
user = Userwork.objects.filter(id=1) | Userwork.objects.filter(name='张三')
print(user)  # <QuerySet [<Userwork: Userwork object (1)>]>
user = Userwork.objects.filter(Q(id=1) | Q(name='张三'))
print(user)  # <QuerySet [<Userwork: Userwork object (1)>]>

get()  获取一个

返回一个实例对象,如果不存在,则会出现异常
user = Userwork.objects.get(id=1)
print(user) # Userwork object (1)  是一个实例

create()  创建一个新的实例

user = Userwork.objects.create(name='嫌弃',phone='12345678908')
user.save()  # 保存
print(user)  # Userwork object (5)  实例对象
user = Userwork.objects.filter(name='嫌弃').values()
print(user)  # <QuerySet [{'id': 5, 'name': '嫌弃', 'phone': '12345678908', 'address': '', 'level': '', 'type': ''}]>  QuerySet 对象

get_or_create()  查询没有,就创建

# 数据库有的情况
user = Userwork.objects.filter(name='嫌弃')
print(user) # <QuerySet [<Userwork: Userwork object (5)>]>
user = Userwork.objects.get_or_create(name='嫌弃')
print(user)  #查询到了,就不会创建  # (<Userwork: Userwork object (5)>, False)
user = Userwork.objects.filter(name='嫌弃')
print(user) # <QuerySet [<Userwork: Userwork object (5)>]>
# 数据库没有的情况
user = Userwork.objects.filter(name='123456')
print(user)  # <QuerySet []>  此时没有123456这个名字的实例
user = Userwork.objects.get_or_create(name='123456')
print(user)  # (<Userwork: Userwork object (6)>, True)  # 新建了一个name为123456的 实例
user = Userwork.objects.filter(name='123456')
print(user)  # <QuerySet [<Userwork: Userwork object (6)>]>  检索到了名字为123456的实例

update_or_create(defaults=None, **kwargs)

更新实例,没有就新建 defaults 是用来更新对象的 (field, value) 对的字典。
user = Userwork.objects.update_or_create(name='嫌弃',defaults={'name':'嫌弃不行'}) # 查看name = '嫌弃',把name改成 嫌弃不行
print(user)  # (<Userwork: Userwork object (5)>, False)  False 表示没有创建
# 数据库没有的情况
user = Userwork.objects.update_or_create(name='嫌弃123', defaults={'name': '嫌弃不行123'})  # 查看name = '嫌弃123',把name改成 嫌弃不行123
print(user)  # (<Userwork: Userwork object (9)>, True) True 表示新建成功

bulk_create()

这个方法以有效的方式将提供的 对象列表 插入数据库
user = Userwork.objects.bulk_create([  # 新增三个名字为zhangsan的实例
    Userwork(name='zhangsan'),
    Userwork(name='zhangsan'),
    Userwork(name='zhangsan'),
])
user= Userwork.objects.filter(name='zhangsan')
print(user) # <QuerySet [<Userwork: Userwork object (10)>, <Userwork: Userwork object (11)>, <Userwork: Userwork object (12)>]>

count()  计数

user = Userwork.objects.filter(name='zhangsan').count() # 数据中有三个,这是我们刚刚添加的zhangsan实例
print(user) # 3

in_bulk(id_list=None, *, field_name='pk')

id_list 接受一个值列表、field_name 接受字段名字但是必须是唯一的,默认是id
user = Userwork.objects.in_bulk([1,2,3]) # 查询 id 为 1/2/3 的实例
print(user)  # {1: <Userwork: Userwork object (1)>, 2: <Userwork: Userwork object (2)>, 3: <Userwork: Userwork object (3)>}
user = Userwork.objects.distinct().in_bulk(['张三','李四','王五'],field_name='name') # 查询 name 为 张三/嫌弃不行123/嫌弃不行 的 实例,但是name 不是唯一字段 所以会报错
print(user) # ValueError: in_bulk()'s field_name must be a unique field but 'name' isn't.

latest(*fields)  返回数据表中最新的

user = Userwork.objects.latest('name')  # 可以根据单个字段也可以多个字段
print(user) # Userwork object (3)

first()  返回一个值

user = Userwork.objects.all().first()
print(user)  # Userwork object (1)

last() 取最后一个

user = Userwork.objects.all().last()
print(user) # Userwork object (9)

exists() 判断是否存在 返回bool

user = Userwork.objects.filter(name='张三').exists()
print(user)  # True

update() 更新实列

并返回匹配操作成功的行数

user = Userwork.objects.filter(name = '张三').update(name='张三123')
print(user) # 1

delete()  删除

并返回删除的对象数量和每个对象类型的删除数量的字典

user = Userwork.objects.filter(id=9).delete()  # 删除id=9 的实例
print(user)  # (1, {'app.Userwork': 1})

exact 

完全匹配。如果提供的比较值是 None,它将被解释为 SQL NULL

user = Userwork.objects.filter(name__exact='李四')
print(user) # <QuerySet [<Userwork: Userwork object (2)>]>

iexact  不区分大小写匹配

Userwork.objects.create(name='My Game')  # 新增一个实例
user = Userwork.objects.filter(name__iexact='my game')  # 不区分大小写
print(user) # <QuerySet [<Userwork: Userwork object (13)>]>

contains  包含

== sql 中的 like

user =Userwork.objects.filter(name__contains='G')  # 检索名字中包含 G 的实例
print(user) # <QuerySet [<Userwork: Userwork object (13)>]>

icontains 不区分大小写的包含

user = Userwork.objects.filter(name__icontains='g')  # 检索名字中包含 g 或 G 的实例
print(user) # <QuerySet [<Userwork: Userwork object (13)>]>

in  

在一个给定的可迭代对象中;通常是一个列表、元组或查询集。这不是一个常见的用例,但字符串(可迭代)是可以接受的

user = Userwork.objects.filter(id__in =[1,2,4])
print(user) # <QuerySet [<Userwork: Userwork object (1)>, <Userwork: Userwork object (2)>, <Userwork: Userwork object (4)>]>

gt 大于 、gte 大于等于、lt 小于、lte 小于等于

user = Userwork.objects.filter(id__gt=2)  # 获取id大于2 的实列
print(user) # <QuerySet [<Userwork: Userwork object (3)>, <Userwork: Userwork object (4)>]>
user = Userwork.objects.exclude(id__lte=3)  # 获取 排除 id小于等于三的实例
print(user) # <QuerySet [<Userwork: Userwork object (4)>]>

startswith 匹配开头字符串

user = Userwork.objects.filter(name__startswith='张') # 检索数据集中 张 字开头的实例
print(user) # <QuerySet [<Userwork: Userwork object (1)>]>

istartswith 匹配开头字符串

user = Userwork.objects.filter(name__istartswith='my') # 检索数据集中 ['my','My','MY','mY'] 字开头的实例
print(user) # <QuerySet [<Userwork: Userwork object (13)>]>

endswith 匹配结束字符串

user = Userwork.objects.filter(name__endswith='123')
print(user) # <QuerySet [<Userwork: Userwork object (1)>]>

iendswith 匹配结束字符串

user = Userwork.objects.filter(name__iendswith='game')
print(user) # <QuerySet [<Userwork: Userwork object (13)>]>

range 范围测试(含)。

startstime = datetime.date(2022,1,1)
endstime = datetime.date(2022, 12, 30)
book = Books.objects.filter(CreateTime__range=(startstime,endstime))
print(book) # <QuerySet [<Books: Books object (1)>, <Books: Books object (2)>, <Books: Books object (3)>]>

date

对于日期时间字段,将值投射为日期。允许链接其他字段的查找。取一个日期值。

user = Books.objects.filter(CreateTime__date=datetime.date(2022,11,15))
print(user)  # <QuerySet [<Books: Books object (3)>]>

year

对于日期和日期时间字段,精确匹配年份。允许链接其他字段的查询。取整数年。

user = Books.objects.filter(CreateTime__year=2022)
print(user)  # <QuerySet [<Books: Books object (1)>, <Books: Books object (2)>, <Books: Books object (3)>]>

month

对于日期和日期时间字段,精确的月份匹配。允许链接其他字段的查询。取整数 1(1 月)到 12(12 月)。

user = Books.objects.filter(CreateTime__month=11)
print(user) # <QuerySet [<Books: Books object (1)>, <Books: Books object (3)>]>
user = Books.objects.filter(CreateTime__month__lte=12)  # 查找月份小于等于12
print(user) # <QuerySet [<Books: Books object (1)>, <Books: Books object (2)>, <Books: Books object (3)>]>

day

对于日期和日期时间字段,精确匹配日期。允许链接其他字段的查询。取整数日。

user = Books.objects.filter(CreateTime__day__lte=15) # 检索日期小于等于 15
print(user) # <QuerySet [<Books: Books object (3)>]>

week

对于日期和日期时间字段,根据 ISO-8601 ,返回星期号(1-52 或 53),即星期从星期一开始,第一周包含一年的第一个星期四。

user = Books.objects.filter(CreateTime__week__gte=32)
print(user) # <QuerySet [<Books: Books object (1)>, <Books: Books object (2)>, <Books: Books object (3)>]>

week_day

​​​​​​​对于日期和日期时间字段,“星期几”匹配。允许链接其他字段的查询。从 1(星期日)到 7(星期六)取一个整数值,代表一周的一天。

user = Books.objects.filter(CreateTime__week_day__lt=5) # 检索小于等于星期4 的实例
print(user) # <QuerySet [<Books: Books object (3)>]>

iso_week_day 

​​​​​​​对于日期和日期时间字段,精确匹配 ISO 8601 星期几。允许链接其他字段的查询。取一个整数值,代表一周的 1(星期一)到 7(星期日)。

user = Books.objects.filter(CreateTime__iso_week_day__gte=5) # 检索大于等于星期5 的实例
print(user) # <QuerySet [<Books: Books object (1)>, <Books: Books object (2)>]>

quarter

对于日期和日期时间字段,“一年的四分之一”匹配。允许链接额外的字段查找。取 1 到 4 之间的整数值,代表一年中的季度。
user  = Books.objects.filter(CreateTime__quarter=4)
print(user) # <QuerySet [<Books: Books object (1)>, <Books: Books object (2)>, <Books: Books object (3)>]>

hour

对于日期时间和时间字段,精确的小时匹配。允许链式查找其他字段。取 0 到 23 之间的整数。

user = Books.objects.filter(CreateTime__hour=13)
print(user) # <QuerySet [<Books: Books object (1)>, <Books: Books object (2)>]>

minute

对于日期时间和时间字段,精确的分钟匹配。允许链式查找其他字段。取 0 到 59 之间的整数。
user = Books.objects.filter(CreateTime__minute=0)
print(user) # <QuerySet [<Books: Books object (3)>]>

second

对于日期时间和时间字段,完全秒配。允许链式查找其他字段。取 0 到 59 之间的整数。
user = Books.objects.filter(CreateTime__second=0)
print(user) # <QuerySet [<Books: Books object (3)>]>

isnull

取 True 或 False,分别对应 IS NULL 和 IS NOT NULL 的 SQL 查询

user = Books.objects.filter(CreateTime__isnull=False) #检索 CreateTime 不为空的实例
print(user) #<QuerySet [<Books: Books object (1)>, <Books: Books object (2)>, <Books: Books object (3)>]>

regex 区分大小写的正则表达式匹配。 
​​​​​​​iregex 不区分大小写的正则表达式匹配

user = Books.objects.filter(title__regex=r'^西+')
print(user) #<QuerySet [<Books: Books object (1)>]>

正向关联

模型有个 ForeignKey,该模型的实例能通过其属性访问关联(外部的)对象。

hero = Heros.objects.filter(book__title='西游记')
print(hero)

方向关联

主键表访问从表(拥有外键字段的表)

user = Books.objects.filter(id=1)
print(user[0].heros_set.all())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源源佩奇

一起进步,提高自己。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值