准备工作 (创表)
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 makemigrationspython 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()
