models.py
class UserInfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=64)
age = models.IntegerField()
date = models.DateField(auto_now=True) # 自动更新时间
# 方便在admin中管理
def __str__(self):
return self.name
views.py
增
user_obj = models.UserInfo(name='alex', age=20)
user_obj.save()
print(user_obj)
# 添加数据方式2
obj = models.UserInfo.objects.create(name='abc', age=20)
print(obj.name)
print(obj)
# 添加数据方式3 批量添加
obj_list = []
for i in range(100000):
obj = models.UserInfo(name='a', age=10)
obj_list.append(obj)
models.UserInfo.objects.bulk_create(obj_list)
删
# 删除数据, queryset 和 model 对象都能调用 delete
models.UserInfo.objects.get(id=3).delete()
models.UserInfo.objects.filter(name='abc').delete()
models.UserInfo.objects.all().delete()
改
# 修改数据 update , model 对象没有 update 方法, 只有 queryset 能调用update
obj = models.UserInfo.objects.filter(name='dadsa').update(age=24)
print(obj)
查
# 查询所有数据 all方法, 返回 queryset 集合
all_objs = models.UserInfo.objects.all()
print(all_objs)
# # < QuerySet[ < UserInfo: UserInfo object(1) >,
# # < UserInfo: UserInfo object(2) >,
# # < UserInfo: UserInfo object(3) >, 类似列表
for obj in all_objs:
print(obj)
# 条件查询1 filter 方法, 返回 queryset 集合, 查询不到内容返回空 queryset,
# queryset 类型可以继续调用filter
obj = models.UserInfo.objects.filter(id=2)
obj = models.UserInfo.objects.filter(name='alex')
print(obj)
# 条件查询2 get 方法, 返回 model 对象, 而且 get 方法必须有且只有一个结果, 否则报错
obj = models.UserInfo.objects.get(id=1)
print(obj)
# 报错1:查询结果多了, 报错2: 没有查询到结果
查询详解
# and
objs = models.UserInfo.objects.filter(id=2, name='alex')
print(objs)
objs = models.UserInfo.objects.filter(**{'name': 'test', 'age': 18}) # get也支持**{}
print(objs)
# exclude 取反 not, objects控制器和queryset对象都能调用, 返回 queryset
objs = models.UserInfo.objects.exclude(id=2, name='alex')
print(objs)
# order_by 排序,可以传多个filed_name,字段前加'-'则为降序, reverse 将查询结果翻转反转
objs = models.UserInfo.objects.order_by('age', '-id').reverse()
print(objs)
# count 计数, queryset 对象调用
num = models.UserInfo.objects.count()
print(num)
alex_num = models.UserInfo.objects.filter(name='alex').count()
print(alex_num)
# last, 返回最后一条数据, queryset 对象调用
obj = models.UserInfo.objects.all().last()
print(obj)
# first, 返回第一条数据, queryset 对象调用
obj = models.UserInfo.objects.filter(name='alex').first()
print(obj)
# exists 查看是否有数据
is_data = models.UserInfo.objects.filter(name='dasdsadas').exists()
print(is_data)
# values/values_list 取值, 返回 queryset, objects 和 queryset 都能调用, 可以指定取哪些字段
data = models.UserInfo.objects.all().values_list() # 元组
print(data)
data = models.UserInfo.objects.all().values() # 字典
print(data)
data = models.UserInfo.objects.all().values('name') # 字典
print(data)
# distinct 去重
objs = models.UserInfo.objects.all().values('name').distinct()
print(objs)
基于双下滑线的模糊查询
# gt 大于, gte 大于等于, lt 小于, lte 小于等于
objs = models.UserInfo.objects.filter(id__gt=3)
print(objs)
objs = models.UserInfo.objects.filter(id__gte=3)
print(objs)
objs = models.UserInfo.objects.filter(id__lt=3)
print(objs)
objs = models.UserInfo.objects.filter(id__lte=3)
print(objs)
# in 在 ... 里面
objs = models.UserInfo.objects.filter(id__in=[1,3,5])
print(objs)
# range 从 ... 到 ...
objs = models.UserInfo.objects.filter(id__range=(3,5)) # id__gte=3, id__lte=5
print(objs)
# contains 包含
objs = models.UserInfo.objects.filter(name__contains='test')
print(objs)
# icontains 包含, 不区分大小写
objs = models.UserInfo.objects.filter(name__icontains='test')
print(objs)
# startswith 以 ... 开头,istartswith 不区分大小写
objs = models.UserInfo.objects.filter(name__startswith='a')
print(objs)
# endswith 以 ... 开头,iendswith 不区分大小写
objs = models.UserInfo.objects.filter(name__endswith='x')
print(objs)
# 查询日期
objs = models.UserInfo.objects.filter(date='2020-04-17')
print(objs)
objs = models.UserInfo.objects.filter(date__day=2,date__month=7)
print(objs)
objs = models.UserInfo.objects.filter(date__day__gt=15)
print(objs)