关于ORM的数据库操作见解

一对多字段增删改查

## 方式一
Publish.objects.create(name="东京出版社", addr="东京")
Publish.objects.create(name="南京出版社", addr="南京")
Publish.objects.create(name="北京出版社", addr="北京")
Book.objects.create(title="西游记", price=59.98, publish_id=1)
Book.objects.create(title="水浒传", price=69.98, publish_id=1)
Book.objects.create(title="红楼梦", price=49.98, publish_id=2)
Book.objects.create(title="三国演义", price=59.98, publish_id=3)

## 方式二
book_obj = Book(title="简爱", price=100.00, publish_id=3)
book_obj.save()

book_obj = Book.objects.filter(pk=1).first()
print(book_obj)

book_queryset = Book.objects.filter(pk=1)
print(book_queryset)

## 方式一
Book.objects.filter(pk=1).update(price=20.00)

## 方式二
book_obj = Book.objects.filter(pk=3).first()
book_obj.price = 120.99
book_obj.save()

删 级联更新, 级联删除

book_obj = Book.objects.filter(pk=5).delete()
print(book_obj)

## 注释
#  (1, {'app01.Book_authors': 0, 'app01.Book': 1})
book_author表删除数据0条, book表删除1条数据

多对多增删改查

增 add 不能使用queryset对象

但是支持id,对象,可以一个或多个

book_obj = Book.objects.filter(pk=3).first()
author_queryset = Author.objects.filter(pk__gte=2)
print(author_queryset)

author_obj, author_obj1 = author_queryset
print(author_obj,author_obj1)
book_obj.authors.add(author_obj,author_obj1)

set支持id,对象,queryset(并且可以一个或多个,将原来的数据编程现在的,更改前后都有的数据不变)

book_obj = Book.objects.filter(pk=3).first()
author_queryset = Author.objects.filter(pk__gte=2)
book_obj.authors.set(author_queryset)

PS:set也可以完成增,他是将多表的所有数据改为现在设置的数据

book_obj = models.Book.objects.filter(pk=3).first()
book_obj.authors.remove(2)# # book_obj.authors.remove(1,2)
author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.authors.remove(author_obj)
book_obj.authors.remove(author_obj,author_obj1)
"""
remove()
括号内 既可以传数字也传对象 并且也是支持传多个的
"""

PS:remove() 括号内 既可以传数字也传对象 并且也是支持传多个的

清空 清空第三张表中所有和这个对象有关的所有数据

 book_obj = models.Book.objects.filter(pk=3).first()# book_obj.authors.clear()

ORM跨表查询 (有连表关系的查询)

正向查询
    从关联字段的表出发,查询被关联表单数据
    PS:正向查询按照字段
反向查询
    从没有关联字段的表出发,查询关联表数据
    PS:反向查询按照表名小写

基于对象的子查询

重点

all与set
正向查询时,查询的对象是多表的一方要加all()

反向查询时,查询对象是多表的一方要有小写表名__set.all(),一般连用,
# 1.查询书籍是python入门的出版社名称
book_obj = models.Book.objects.filter(title='python入门').first()
# 正向查询按字段
print(book_obj.publish.name)
print(book_obj.publish.addr)
# 2.查询书籍主键是6的作者姓名
book_obj = models.Book.objects.filter(pk=6).first()
print(book_obj.authors)  # app01.Author.None
print(book_obj.authors.all())
# 3.查询作者是jason的手机号
author_obj = models.Author.objects.filter(name='jason').first()
print(author_obj.author_detail.phone)
print(author_obj.author_detail.addr)

注意set.all()
# 4.查询出版社是东方出版社出版过的书籍
publish_obj = models.Publish.objects.filter(name='东方出版社').first()
print(publish_obj.book_set)  # app01.Book.None
print(publish_obj.book_set.all())
# 5.查询作者是jason写过的所有的书
author_obj = models.Author.objects.filter(name='jason').first()
# print(author_obj.book_set)  # app01.Book.None
print(author_obj.book_set.all())
# 6.查询手机号是110的作者
author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
print(author_detail_obj.author)
print(author_detail_obj.author.name)
print(author_detail_obj.author.age)

基于双下划线的连表查询

总结:

有连表关系,就可以用双下划线跳跃的另一张表进行查询
    一对一 直接跳到另一张表
    一对多 直接跳到另一张表
    多对多,直接跳过第三张表,进入对应的表
不管是哪一个查询,都可以一样的查询,并且查询出的都是queryset对象
连表查询中的正向与反向
    正向:
        外键字段__另一种表的字段
            当使用外键字段__时,就已经进入了另一张表了
    反向
        另一张表名小写__另一张表的字段
            当使用外键字段__时,就已经进入了另一张表了
    

PS:上述内容可以在filter/values中使用

# 1.查询书籍是python入门的出版社名称
# 正向
res = models.Book.objects.filter(title='python入门').values('publish__name')
print(res)
# 反向
res = models.Publish.objects.filter(book__title='python入门').values('name')
print(res)

# 2.查询作者是jason的手机号码
# 正向
res1 = models.Author.objects.filter(name='jason').values('author_detail__phone')
print(res1)
# 反向
res = models.AuthorDetail.objects.filter(author__name='jason').values('phone','author__age')
print(res)

# 3.查询手机号是120的作者姓名

res2 = models.AuthorDetail.objects.filter(phone=120).values('author__name')
print(res2)
res = models.Author.objects.filter(author_detail__phone=120).values('name','author_detail__addr')
print(res)

# 4.查询出版社是东方出版社出版的书籍名称
res = models.Publish.objects.filter(name='东方出版社').values('book__title','addr')
print(res)
# 5.查询作者是jason的写过的书的名字和价格
res = models.Author.objects.filter(name='jason').values('book__title','book__price')
print(res)

# 7.查询书籍是python入门的作者的手机号
res = models.Book.objects.filter(title='python入门').values('authors__author_detail__phone')
print(res)

原文地址:https://www.cnblogs.com/marklijian/p/11734247.html

时间: 2024-10-13 05:31:56

关于ORM的数据库操作见解的相关文章

Django(三) ORM 数据库操作

比较有用 转自 http://blog.csdn.net/fgf00/article/details/53678205 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段类型 1.字段类型介绍 2.字段参数介绍 3.Django ORM 外键操作 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 ORM:关系对象映射.定义一个类自动生成数

Django入门4: ORM 数据库操作

大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段类型 1.字段类型介绍 2.字段参数介绍 3.Django ORM 外键操作 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 ORM:关系对象映射.定义一个类自动生成数据库的表结构. 创建数据库的时候,一般有以下几种常用数据类型:数字.字符串以及时间. ORM分为两种: DB Fi

Django学习【第5篇】:Django之ORM数据库操作

django之ORM数据库操作 一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例化对象 ORM的两大功能: 操作表: - 创建表 - 修改表 - 删除表 操作数据行: - 增删改查 ORM利用pymysql第三方工具链接数据库 Django没办法帮我们创建数据库,只能我们创建完之后告诉它,让django去链接 二.创建表之前的准备工作 一.自己创建数据库

【Django】ORM数据库操作

Django-ORM数据库操作 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例化对象 ORM的两大功能: 操作表: - 创建表 - 修改表 - 删除表 操作数据行: - 增 删 改 查 ORM利用pymysql第三方工具链接数据库 Django默认的是sqlite数据库 将Django数据库修改为mysql: 1.settings.py 配置 DATABASES = {

C# .NET更智能的数据库操作的封装

前述: 对数据库操作的封装,相信网络上已经有一大堆,ORM框架,或者是.NET本身的EF,都很好的支持数据库操作.这篇文章是分享自己所思考的,对数据库操作的简单封装.我对于这篇文章,认为被浏览者所关注重点的是怎么分析设计数据库操作封装,代码是其次.而且,这是我第一篇文章,为了想好怎么实现花了些天,代码是博客发表时现写的.所以我想,使用可能还有bug,而且没有try catch异常的设计. 这个框架我理应做到对数据库无关,无论是哪个数据库都能够使用.不过,重点在于分析,而不是代码.所以,为了更好的

django的模型类管理器-----------数据库操作的封装

模型实例方法 str():在将对象转换成字符串时会被调用. save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句. delete():将模型对象从数据表中删除,ORM框架会转换成对应的delete语句. 模型类的属性 属性objects:管理器,是Manager类型的对象,用于与数据库进行交互. 当没有为模型类定义管理器时,Django会为模型类生成一个名为objects的管理器,自定义管理器后,Django不再生成默认管理器objects. 管理器是D

Android Afinal框架学习(一) FinalDb 数据库操作

框架地址:https://github.com/yangfuhai/afinal 对应源码: net.tsz.afinal.annotation.sqlite.* net.tsz.afinal.db.sqlite.* net.tsz.afinal.db.table.* net.tsz.afinal.utils.ClassUtils.net.tsz.afinal.utils.FieldUtils FinalDb 建库 FinalDb db = FinalDb.create(context, "my

关于Django中的数据库操作API之distinct去重的一个误传

关于Django中的数据库操作API之distinct去重的一个误传 最近在做一个Server的项目,后台框架是Apache mod_wsgi + django.django是一个基于Python的Web开发框架,功能十分强大,至于有多强大,还是读者们自己去体验吧.我在这里要说的一个问题是关于Python的ORM功能的.问题就在django提供的数据库操作API中的distinct()函数,了解SQL语句的读者都应该知道,DISTINCT关键字可以在select操作时去重.django里的这个d

C# SQLite 数据库操作

C# SQLite 数据库操作学习 运行环境:Window7 64bit,.NetFramework4.61,C# 7.0: 编者:乌龙哈里 2017-03-19 参考: SQLite 官网 SQL As Understood By SQLite System.Data.SQLite 菜鸟教程 SQL 教程 章节: 1.下载安装 2.数据类型 3.创建数据库 4.删除数据库 5.创建表 6.删除表 7.查询表结构 8.更改表名 9.增加列(字段) 10.读取创建表的 SQL 语句 11.更改列名