ORM 关系对象映射 基础知识点
优点:
1.ORM使我们通用的数据库变得更加的简单便捷。
2.可避免新手程序员写sql语句带来的性能问题。
1. 创建单表
2. 创建关键表
1). 一对一
2). 一对多
3). 多对多
创建表的语句:
python manage.py makemigrations
python manage.py migrate
插入:
Author.object.create(**{'name':'wjw'})
修改:
# 方法一 author = models.Author.objects.get(id=5) author.name = 'haha' author.save() # 方法二 models.Author.objects.filter(id=5).update(name='haha')
查询:
.filter(**kwargs) # 集合
.all() # 集合
.get(**kwargs) # 行对象
排序:
au = models.Author.objects.order_by('-id')
.reverse() 对查询结果反向排序
.distinct() 从返回结果中去重
.count() 数量
.first() 取第一条
.last() 取最后一条
.exists() 如果QuerySet中包含数据返回true,否则返回false
一对多:
创建数据表
class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() class Book(models.Model): author = models.ForeignKey('Author', on_delete=models.CASCADE) namebook = models.CharField(max_length=32) nametype = models.CharField(max_length=32)
正向查询
# 正向查询 obj = models.Book.objects.filter(namebook='python')[0] print(obj.author.name) # 连级查询 obj = models.Book.objects.values('namebook', 'author__name')[0] print(obj['namebook'] + "++++" + obj['author__name'])
反向查询
# 反向查询 obj = models.Author.objects.filter(name='lixiangshuai')[0] list = obj.book_set.all().values('namebook') print(list) for item in list: print(item['namebook'])
多对多:
创建多对多数据表
class Teacher(models.Model): name = models.CharField(max_length=32) sex = models.CharField(max_length=32) class Student(models.Model): name = models.CharField(max_length=32) sex = models.CharField(max_length=32) teacher = models.ManyToManyField('Teacher')
正向查询
s = models.Student.objects.filter(name='wangjiawei')[0] t = s.teacher.all() for i in t: print(i.name)
反向查询
t = models.Teacher.objects.get(name='zhangjiong') s = t.student_set.all()
# s = t.student_set.all().values('name')
for i in s:
print(i.name)
基于 __ (双下划綫)的条件查找:
只适用于单表
id__lt = 10, id__gt = 1 # id>1 并且 id<10 id__in = [11, 22, 33] # id = 11,22,33,的数据 .exclude(id__in=[11, 22, 33]) # not in id__range = [1,2] # 范围 bettween··· and ··· name__contains = 'ven' name__icontains = 'ven' # icontains 大小写不敏感 __startwith = 'p' # 开头是 p
聚合查询
.aggregate(*args, **kwargs) # 平均价格 .aggregate(avarage_price = Avg('price')) >>> {'avarage_price':34.35}
Avg 平均值
Min 最小值
Max 最大值
Sum 求和
分组查询
annotate(*args, **kwargs) models.Author.objects.values('author__name').annotate(sum('price'))
完成~! 收工!!~!~!
【版权声明】本博文著作权归作者所有,任何形式的转载都请联系作者获取授权并注明出处!
【重要说明】博文仅作为本人的学习记录,论点和观点仅代表个人而不代表技术的真理,目的是自我学习和有幸成为可以向他人分享的经验,因此有错误会虚心接受改正,但不代表此刻博文无误!
【博客园地址】叫我+V : http://www.cnblogs.com/wjw1014
【CSDN地址】叫我+V : https://wjw1014.blog.csdn.net/
【Gitee地址】叫我+V :https://gitee.com/wjw1014
【重要说明】博文仅作为本人的学习记录,论点和观点仅代表个人而不代表技术的真理,目的是自我学习和有幸成为可以向他人分享的经验,因此有错误会虚心接受改正,但不代表此刻博文无误!
【博客园地址】叫我+V : http://www.cnblogs.com/wjw1014
【CSDN地址】叫我+V : https://wjw1014.blog.csdn.net/
【Gitee地址】叫我+V :https://gitee.com/wjw1014
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!