记录查询包括:跨表查询(重点),  分组查询,聚合查询,  F与Q查询

查询之前需要先添加数据:

一对多添加:

def addrecord(request):

  Book.objects.create( title="py", price=111, pub_date="2012-12-12"  (添加3个普通字段)

            publish_id=1)

"_id" 是拼上去的,这是个特殊字段, publish是book的属性,这个字段关联到表Publish.

多对多添加:

主要是给第三张表加记录

book=Book.objects.create(.................)  #先创建一条对象:

方式一:

alex=Author.objects.filter(name="Alex").first()

egon=Author.objects.filter(name="egon").first()

book.authors.add()

方式一是取出两个主键1,2然后和book拼

方式二:

book.authors.add(1,2)  #直接添加Author表里对应的两个主键

方式三:(推荐的)

book.authors.add(*[1,2])   #把列表中的元素打散后再逐个添加

总结

添加表记录:

  一对一和一对多,使用create方法。它有2种使用方法:

    1. create(字段名1=值1...)。适用于表单添加操作!注意,这里面的字段名是ORM创建表之后的的字段名

      比如: book类的publish属性,它是关联字段,ORM创建之后,字段名为publish_id

    2.create(模型类属性1=值1...)。比如book类的publish属性,它是关联字段。

      直接create(publish=obj1),注意,它接收一个model对象,对象包含了主键id

  多对多使用add方法。add用2种使用方法:

    1.add(obj1,obj2...) 它接收一个model对象,对象包含了主键id

    2.add(主键id1,主键id2...) 它接收一个主键id。适用于表单添加操作!

    还有一个python的打散语法,前面加一个*就可以了。比如*[1,2],它会依次调用前置方法,每次只取一个值。表单操作,会用到!

多对多解除绑定:

remove()方法

举例:删除python这本书的xiao作者
那么只需要删除book_authors表,id为1的这一条记录,就可以了

但是,不能直接对这张表,直接删除。因为它是2个表的关联表。

def add(request):
book = Book.objects.filter(id=3).first() # 先找到这本书
xiao = Author.objects.filter(name="xiao").first() # 再找到作者
book.authors.remove(xiao) # 解除绑定的关系
return HttpResponse('添加成功')

clear()清理所有关系对象

举例:将book_id等于3的所有的作者删除

上面的例子,用remove,可以将一个删除。如果这本书,有5个作者呢?

一个个remove?太累了!django提供了clear方法,可以清理所有关系对象。

def add(request):
book = Book.objects.filter(id=3).first()
book.authors.clear() # 清理所有关系对象
return HttpResponse('添加成功')
刷新页面,再次查看book_authors表记录,发现已经空了!

set([obj1,obj2....]) 先清空再设置

举例:

python这本书目前有3个作者,将wang设置为这本书的唯一作者

怎么做呢?将另外2个作者解除关系就可以了。

def add(request):
book = Book.objects.filter(id=3).first() # 先找到书
xiao = Author.objects.filter(name="xiao").first() # 再找到作者
zhang = Author.objects.filter(name="zhang").first()
book.authors.remove(xiao,zhang) # 解除绑定的关系 return HttpResponse('添加成功'

但是这样将2个作者解除,太麻烦了。

还有一种做法,先清空,再设置

def add(request):
book = Book.objects.filter(id=3).first() # 先找到书
book.authors.clear() # 清理所有关系对象
wang = Author.objects.filter(name="wang").first()
book.authors.add(wang) return HttpResponse('添加成功'

django提示了set方法,直接合并了先清空再设置的操作

它必须接收一个数组,因为可以接收多个值

def add(request):
book = Book.objects.filter(id=3).first() # 先找到书
wang = Author.objects.filter(name="wang").first() # 再找作者
book.authors.set([wang]) #先清空再设置 return HttpResponse('添加成功')

总结: 

删除记录:

  适用于一对一,一对多,多对一。

  remove(obj1, obj2, ...) 去除多个关系对象。它需要指定一个或者多个对象

  clear() 清理所有关系对象。不管现有的关系有多少,一律清空!

  set([obj1,obj2...]) 先清空再设置。不管现有的关系有多少,一律清空再设置。适用于网页后台修改操作

ORM的记录添加和删除的更多相关文章

  1. 优化MVC,实现数据库表的记录的添加、删除、修改、查询。

    一.在UserDAO里面重写实体user要调用的方法: 1.查询所有user表中的记录.用getAllUser()方法得到List public class UserDAO { public List ...

  2. python全栈开发day61-django简单的出版社网站展示,添加,删除,编辑(单表的增删改查)

    day61 django内容回顾: 1. 下载: pip install django==1.11.14 pip install -i 源 django==1.11.14 pycharm 2. 创建项 ...

  3. Django实现简单的用户添加、删除、修改等功能

    一. Django必要的知识点补充 1. templates和static文件夹及其配置 1.1 templates文件夹 所有的HTML文件默认都放在templates文件夹下. 1.2 stati ...

  4. mysql用户密码修改,用户添加、删除及设置权限

    一下的示例所用用户名和密码为:test,111111 Mysql密码修改: Mysql修改密码需要root的权限,先执行mysql -uroot -p(密码); 1)使用set password方式来 ...

  5. LNMP添加、删除虚拟主机及伪静态使用教程

    一般情况下每个虚拟主机就是一个网站,网站一般通过域名进行访问.LNMP 1.2的网站添加过程和LNMP 1.1的基本类似,但是增加了FTP和数据库的创建.LNMP1.2的防跨目录也由原来在php.in ...

  6. SQL语句的添加、删除、修改多种方法

    SQL语句的添加.删除.修改虽然有如下很多种方法,但在使用过程中还是不够用,不知是否有高手把更多灵活的使用方法贡献出来? 添加.删除.修改使用db.Execute(Sql)命令执行操作╔------- ...

  7. ArcEngine查询、添加、删除要素的方法

    原文 ArcEngine查询.添加.删除要素的方法 1.查找数据 1).利用FeaturCursor进行空间查询 //空间查询 ISpatialFilter spatialFilter = new S ...

  8. iptables 添加,删除,查看,修改

      iptables是linux系统自带的防火墙,功能强大,学习起来需要一段时间,下面是一些习iptables的时候的记录.如果iptables不熟悉的话可以用apf,是一款基于iptables的防火 ...

  9. 跟我一起学extjs5(19--模块记录的拖放删除、拖放复制新增)

    跟我一起学extjs5(19--模块记录的拖放删除.拖放复制新增)         网页其中的拖放(drag-drop)是比較有趣的操作,extjs5中非常好的封装了拖放的动作,也有各种类来支持,可是 ...

随机推荐

  1. 多线程Parallel和Task

    不管是Parallel还是Task,最里面都是线程池(里面是线程)当开启多个任务后,系统会根据当前的线程池的资源进行分配,任务则进行等待Parallel可以对系统的CPU进行设置,可以最大程度上榨干系 ...

  2. 通通WPF随笔(3)——艺术二维码素材生成器

    原文:通通WPF随笔(3)--艺术二维码素材生成器 最近公司让我开发一个条形码的生成控件,花了半天时间搞定觉得不过瘾,什么年代了该用二维码了吧.于是wiki了一下二维码的资料. 比较常见的就是QR码( ...

  3. 《Docker 实战》第三章 Docker Hub 寻宝游戏

    # 秘密仓库和密码 docker run --rm -it --name password dockerinaction/ch3_ex2_huntanswer

  4. Qt 制作透明背景图片与裁剪图片(很实用)

    这两天想做一个五子棋游戏,想从零开始自己绘制各种图片素材,将经验心得整理如下. 制作透明背景图片: void MyPainter::DrawKit() { QImage image(30, 30, Q ...

  5. Expression Blend实例动画-大坝水位升高演示

    原文:Expression Blend实例动画-大坝水位升高演示 Expression Blend是个很强大的东西,用它可以完成很多不好做的动画效果. 动画的主要元素: 时间线(Timeline) : ...

  6. 深入浅出RPC——浅出篇 深入篇

    本文转载自这里是原文 近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 RPC 在其中扮演着关键的作用. 在平时的日常开发中我们都在隐式或显式的使用 RPC,一些刚入行的程序 ...

  7. Win10《芒果TV》更新v3.8.30流星版:优化稳定性、升级无边框播放体验

    随着暑假到来,大波王牌综艺和青春电视剧热浪来袭,Win10版<芒果TV>全平台同步更新流星版v3.8.30,进一步提升稳定性,巩固播放体验,升级剧场模式和画中画无边框体验,我们在芒果等你. ...

  8. 微信小程序把玩(三十一)wx.uploadFile(object), wx.downloadFile(object) API

    原文:微信小程序把玩(三十一)wx.uploadFile(object), wx.downloadFile(object) API 反正我是没有测通这两个API!!!!不知道用的方式不对还是其他的!! ...

  9. fatal error LNK1169:找到一个或多个重定义的符号

    这个算是个比较基础的问题,由于我不是C程序员,本行java,临时拉来做的,所以有些坑还得自己走出来. 这个问题是由于,全局变量在a.h中定义,在两个源文件a.cpp和b.cpp中引用,之后被编译器认为 ...

  10. ML:吴恩达 机器学习 课程笔记(Week5~6)

    Neural Networks: Learning Advice for Applying Machine Learning Machine Learning System Design