目录
dates(field, kind, order='ASC')
update_or_create(defaults=None, **kwargs)
in_bulk(id_list=None, *, field_name='pk')
gt 大于 、gte 大于等于、lt 小于、lte 小于等于
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())