ORM操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORM操作相关的知识,希望对你有一定的参考价值。

1,外键

2,多对多

3,一对一  外键加唯一索引

 

 

注意values查询返回的是一个字典的queryset

查看聚合分组的源码  所以注意分组一定要使用values

技术分享

 

 

4,注意查询表与表之间通过外键和多对多关系关联。

 

5,ORM查询和sql查询逻辑相似。不同表之间查询需要通过键实现。

 

from django.db.models import Avg,Min,Sum,Max,Count
from django.db.models import F,Q

def tp5(request):
# #通过orm外键查询书和作者关系
# ret=Book.objects.values(‘title‘,‘authors__name‘)
# print(‘=========>‘,ret)


#单表查询 查询python这边书的价格
# ret=Book.objects.filter(title=‘python‘).values(‘pric‘)


#注意下面是查询是依赖的ForeignKey ForeignKey
# 查询python的这边书的出版社的联系方式
# ret = Book.objects.filter(title=‘python‘).values(‘publisher__address‘)
# print(ret)

#查询python的所有作者名字
# ret=Book.objects.filter(title=‘python‘).values(‘authors__name‘)
# print(ret)


#查询alex出版的所有书的name
ret=Book.objects.filter(authors__name=‘alex‘).values(‘title‘)
print(ret)


#反向查询
ret=author.objects.filter(name=‘alex‘).values(‘book__title‘)
print(‘反向查询‘,ret)


ret=Book.objects.first()
print(ret.title)
print(‘==========‘,ret)
ret=Book.objects.filter(title=‘python‘).values(‘publisher__name‘)
print(ret)

#####aggregate对queryset进行统计
ret=Book.objects.all().aggregate(sum=Sum(‘pric‘))
print(ret)
ret = Book.objects.all().aggregate(count=Count(‘title‘))
print(ret)

#select AVG(pric) from book;
ret=Book.objects.all().aggregate(pric=Avg(‘pric‘),maxpric=Max(‘pric‘))
print(ret)

# ret=Book.objects.filter(title=‘python‘).values(‘authors__name‘)
# print(ret)

####分组查询annotate对分组后的queryset值进行操作
ret=Book.objects.filter(authors__name=‘alex‘).aggregate(Sum(‘pric‘))
print(ret)

ret=author.objects.filter(name=‘alex‘).aggregate(Sum(‘book__pric‘))
print(‘dddddd‘,ret)
print(‘@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@‘)
#每个作者出的书的总价格
ret=Book.objects.values(‘authors__name‘).annotate(pric=Sum(‘pric‘))
print(‘分组‘,ret)
print(‘#######################‘)


##自动通过第三张表完成作者和书的关系查询
ret = Book.objects.values(‘authors__name‘)
print(ret)

#自动通过外键完成了书和出版社的关系查询
ret=Book.objects.values(‘title‘,‘publisher__name‘)
print(‘书和出版社的关系‘,ret)



##注意聚合和分组的查询都是对queryset
ret=Book.objects.values(‘authors__name‘).annotate(Sum(‘pric‘))

print(ret)
return HttpResponse(‘执行成功‘)

 

def tp6(request):

ret=Book.objects.values().aggregate(Avg(‘pric‘),Max(‘pric‘))
print(ret)

ret=author.objects.filter(name=‘alex‘).aggregate(Sum(‘book__pric‘))
print(ret)


ret=Book.objects.filter(authors__name=‘alex‘).aggregate(Sum(‘pric‘))
print(ret)


#OrderedDict通过对字典元素排序
ret=Book.objects.values(‘authors__name‘).annotate(Sum(‘pric‘))
print(ret)



return HttpResponse(‘执行成功‘)


def tp7(request):
‘‘‘
F查询 F就是之前的值
Q查询 Q可以多层嵌套
Q查询 与或非
& | ~
:param request:
:return:
‘‘‘
# Book.objects.update(pric=F(‘pric‘)+20)

ret=Book.objects.filter(
Q(title__startswith=‘p‘)|Q(title__startswith=‘l‘)
).first()
print(ret)

ret = Book.objects.filter(
Q(Q(pric__lt=300)&Q(pric__gt=270))
)
print(‘dddddddddddddd‘,ret)
Book.objects.filter(title=‘python‘).delete()
return HttpResponse(‘执行成功‘)

























































































































以上是关于ORM操作的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

Django之ORM操作

Django---ORM操作大全

Django-ORM操作数据库无数据问题