准备工作 (创表)
models.py
以下操作为创建一个表 名称为 应用名称_info (testdb_info)
class info(models.Model):
name = models.CharField(max_length=16)
age = models.IntegerField(default=1)
django不会自动触发model.py创建表 需要执行以下命令
python manage.py makemigrations
python manage.py migrate
django会自动将orm语句转为创表语句在数据库中执行
创表语句如下:
CREATE TABLE `testdb_info` (
`id` bigint NOT NULL AUTO_INCREMENT, -- id 自增
`name` varchar(16) NOT NULL, -- name vachan类型 长度16
`age` int NOT NULL, -- age int类型
PRIMARY KEY (`id`)
增
# 创建方式一
# obj = models.info(
# name='zhangsan',
# age=100
# )
# obj.save()
# 创建方式二
# obj = models.info.objects.create(name='lisi',age='50')
# 创建方式三 批量创建
# obj_list = []
# for i in range(1,5):
# obj = models.info(
# name='%s号' %i,
# age= 20 + i
# )
# obj_list.append(obj)
# models.info.objects.bulk_create(obj_list)
# 创建方式四 创建或更新 update_or_create 有更新没有创建
# id=1 有这个值进行更新 sql: update testdb_info set age = '30' where id = 1;
# models.info.objects.update_or_create(
# id=1, # 查询的条件
# defaults={
# 'age':30 # 更改的值
# }
# )
# wangwu这个用户没有 所以会在数据库创建一条数据
# models.info.objects.update_or_create(
# name='wangwu',
# defaults={
# 'age': 21
# }
# )
删
# 删除 queryset 和 model都可以调用
# models.info.objects.filter(id=9).delete()
# models.info.objects.get(id=8).delete()
改
# 改 不能调用model方法 只能调用queryset
# models.info.objects.filter(name='1号').update(age=300)
# models.info.objects.get(name='2号').update(age=30) get获取到的是model 所以会报错
# obj = models.info.objects.get(id=1)
# obj.age = 10
# obj.save()
查
# 查 入门级
# 查询所有数据 返回的是queryset 集合
# all_obj = models.info.objects.all()
# all = all_obj.values() # 对象套列表套字典
# <QuerySet [{'id': 1, 'name': 'zhangsan', 'age': 30}, {'id': 2, 'name': 'zhangsan', 'age': 100}, {'id': 3, 'name': 'lisi', 'age': 50}, {'id': 4, 'name': 'lisi', 'age': 50}, {'id': 5, 'name': '1号', 'age': 300}, {'id': 6, 'name': '2号', 'age': 22}, {'id': 7, 'name': '3号', 'age': 23}]>
# for i in all:
# print(i)
# 结果集
# {'id': 1, 'name': 'zhangsan', 'age': 30}
# {'id': 2, 'name': 'zhangsan', 'age': 100}
# {'id': 3, 'name': 'lisi', 'age': 50}
# {'id': 4, 'name': 'lisi', 'age': 50}
# {'id': 5, 'name': '1号', 'age': 300}
# {'id': 6, 'name': '2号', 'age': 22}
# {'id': 7, 'name': '3号', 'age': 23}
# 条件查询 filter 查询返回的值 为空也不会报错,可以返回多个
# obj = models.info.objects.filter(id=1)
# print(obj)
# 条件查询 get 查询返回的值必须是1个 返回多个或者为空都会报错
# obj = models.info.objects.get(id=1)
# print(obj.values()[0]) # id获取的结果是一个 所以可以直接把第一个下标取出来
# 查询所有数据 返回的是queryset 集合
# all_obj = models.info.objects.all().first() # 取第一条
# all_obj = models.info.objects.all().last() # 取最后一条
# obj = models.info.objects.values('name').distinct() # 去重 <QuerySet [{'name': 'zhangsan'}, {'name': 'lisi'}, {'name': '1号'}, {'name': '2号'}, {'name': '3号'}]>
# obj = models.info.objects.values('name') # 没去重 <QuerySet [{'name': 'zhangsan'}, {'name': 'zhangsan'}, {'name': 'lisi'}, {'name': 'lisi'}, {'name': '1号'}, {'name': '2号'}, {'name': '3号'}]>
# obj = models.info.objects.all().count() # 获取次数
# obj = models.info.objects.filter(id__gt=1) # id大于1的值
# obj = models.info.objects.filter(id__gte=1) # id大于等于1
# obj = models.info.objects.filter(id__lt=5) # id小于
# obj = models.info.objects.filter(id__lte=5) # id小于等于
# obj = models.info.objects.filter(id__lte=5,id__gt=1) # 小于等于5 大于1
# obj = models.info.objects.filter(name__startswith='li') # 以li开头
# like
# obj = models.info.objects.filter(name__contains='号')
# in
# obj = models.info.objects.filter(id__in=[1, 3, 5]) # 取 id为 1,3,5的数据·
# obj = models.info.objects.exclude(id__in=[1, 3, 5]) # 取id不为 1,3,5的数据
# order by
# obj = models.info.objects.filter(name='zhangsan').order_by('id') # asc 升序
# obj = models.info.objects.filter(name='zhangsan').order_by('-id') # asc 降序
# range
# obj = models.info.objects.filter(id__range=[1, 2]) # between and
# group by
# from django.db.models import Count , Min , Max, Sum
# obj = models.info.objects.filter(name='zhangsan').values('id').annotate(c=Count('id'))
# SELECT "info"."name", COUNT("info"."id") AS "c" FROM "info" WHERE "info"."name" = 'zhangsan' GROUP BY "info"."id"
# print(obj)
# 返回布尔值 True False
# obj = models.info.objects.filter(id=1).exists()
# 返回一个查询集合 [(列表套元组)]
# obj = models.info.objects.all().values_list()