ORM一般操作

ORM一般操作
1. 必知必会13条
1. 返回QuerySet对象的
1. all()
2. filter()
3. values()
4. values_list()
5. exclude()
6. order_by()
7. reverse()
8. distinct()
2. 返回具体对象的
1. get()
2. first()
3. last()
3. 返回布尔值的
1. exists()
4. 返回具体数值的
1. count()
2. 单表查询的双下划线
1. models.Book.objects.filter(id__gt=1)
2. models.Book.objects.filter(id__in=[1,2,3])
3. models.Book.objects.filter(id__range=[1,5])
4. models.Book.objects.filter(title__contains="沙河")
5. models.Book.objects.filter(title__icontains="沙河")
6. models.Book.objects.filter(title__startswith="沙河")
7. models.Book.objects.filter(title__endswith="沙河")
8. models.Book.objects.filter(publish_date__year=2017)
9. models.Book.objects.filter(publish_date__month=2)
3. 外键的跨表查询
1. 正向查找
1. 基于对象
book_obj = models.Book.object.get(id=1)
book_obj.publisher.name

2. 基于双下划线的
models.Book.object.filter(id=1).values("publisher__name")

2. 反向查找(由出版社查书)
1. 基于对象
publisher_obj = models.Publisher.objects.get(id=1)
默认反向查找的时候是表名加_set
publisher_obj.book_set.all()
如果在外键中设置了related_name="books"
publisher_obj.books.all()

2. 基于双下划线
models.Publisher.objects.filter(id=1).values("book__title")
如果配置了related_query_name="books"
models.Publisher.objects.filter(id=1).values("books__title")

4. 分组和聚合
1. 聚合
from django.db.models import Avg, Sum, Max, Min, Count
models.Book.objects.all().aggregate(Avg("price"))
2. 分组
book_list = models.Book.objects.all().annotate(author_num=Count("author"))

5. F和Q
1. 当需要字段和字段作比较的时候用F查询
2. 当查询条件是 或 的时候 用Q查询,因为默认的filter参数都是且的关系

6. 事务
1. 保证数据的原子性操作!!!

def test(request):
# 创建数据
# models.UserType.objects.create(title='普通用户')
# models.UserType.objects.create(title='二逼用户')
# models.UserType.objects.create(title='牛逼用户')

# models.UserInfo.objects.create(name='方少伟',age=18,ut_id=1)
# models.UserInfo.objects.create(name='由秦兵',age=18,ut_id=2)
# models.UserInfo.objects.create(name='刘庚',age=18,ut_id=2)
# models.UserInfo.objects.create(name='陈涛',age=18,ut_id=3)
# models.UserInfo.objects.create(name='王者',age=18,ut_id=3)
# models.UserInfo.objects.create(name='杨涵',age=18,ut_id=1)

# 获取
# QuerySet[obj,obj,obj]
# result = models.UserInfo.objects.all()
# for obj in result:
# print(obj.name,obj.age,obj.ut_id,obj.ut.title)

# UserInfo,ut是FK字段 - 正向操作 PS: 一个用户只有一个用户类型
# obj = models.UserInfo.objects.all().first()
# print(obj.name,obj.age,obj.ut.title)

# UserType, 表名小写_set.all() - 反向操作 PS: 一个用户类型下可以有很多用户
# obj = models.UserType.objects.all().first()
# print('用户类型',obj.id,obj.title)
# for row in obj.userinfo_set.all():
# print(row.name,row.age)

# result = models.UserType.objects.all()
# for item in result:
# print(item.title,item.userinfo_set.filter(name='xx'))

# obj
# [obj,obj,]

# result = models.UserInfo.objects.all().values('id','name')
# QuerySet[{'id':'xx','name':'xx'} ]
# for row in result:
# print(row)

# result = models.UserInfo.objects.all().values_list('id','name')
# QuerySet[(1,'f'), ]
# for row in result:
# print(row)

# 数据获取多个数据时
# 1. [obj,obj,obj,]
# models.UserInfo.objects.all()
# models.UserInfo.objects.filter(id__gt=1)
# result = models.UserInfo.objects.all()
# for item in result:
# print(item.name,item.ut.title)

# 2. [{id:1,name:fd},{id:1,name:fd},{id:1,name:fd},]
# models.UserInfo.objects.all().values('id','name')
# models.UserInfo.objects.filter(id__gt=1).values('id','name')
# 无法跨表
# result = models.UserInfo.objects.all().values('id','name')
# for item in result:
# print(item['id'],item['name'])
# 夸表 __
# result = models.UserInfo.objects.all().values('id','name',"ut__title")
# for item in result:
# print(item['id'],item['name'],item['ut__title'])


# 3. [(1,df),(2,'df')]
# models.UserInfo.objects.all().values_list('id','name')
# models.UserInfo.objects.filter(id__gt=1).values_list('id','name')
# 无法跨表
# result = models.UserInfo.objects.all().values_list('id','name')
# for item in result:
# print(item[0],item[1])
# 夸表 __
# result = models.UserInfo.objects.all().values_list('id','name',"ut__title")
# for item in result:
# print(item[0],item[1],item[2])

 

posted on 2019-08-20 17:44  Adudu001  阅读(86)  评论(0编辑  收藏  举报

导航