记录查询包括:跨表查询(重点),  分组查询,聚合查询,  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...]) 先清空再设置。不管现有的关系有多少,一律清空再设置。适用于网页后台修改操作

最新文章

  1. dom4j读取某个元素的某个属性
  2. shell脚本嵌套expect脚本
  3. sql server项目死活启动不了的问题
  4. Android Service完全解析,关于服务你所需知道的一切(上)
  5. Drupal如何更新注册表?
  6. ExtJS4 MVC开发教程:搭建开发环境
  7. 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研
  8. MySQL字符串中数字排序的问题
  9. bzoj1664 [Usaco2006 Open]County Fair Events 参加节日庆祝
  10. 京香julia_百度百科
  11. JNI只C性能测试
  12. 用window的onload事件,窗体加载完毕的时候
  13. Day2_数字类型_字符串类型_列表类型_元组_字典_集合_字符编码_文件处理
  14. ruby创建某些“关键字”方法别名的语法
  15. php 表单提交大量数据发生丢失的解决方法
  16. Java中final、finally、finalize有什么区别?
  17. 橙色优学:Java编程怎么提升技术,Java编程思维至关重要
  18. 【组合数】[NOIP2011]选择客栈[c++]
  19. sysfs文件系统的建立【转】
  20. 《Linux内核设计与分析》第四章读书笔记

热门文章

  1. 获取 UIElement 相对于屏幕原点所占用的矩形区域
  2. layerui
  3. 【msdn wpf forum翻译】TextBox中文本 中对齐 的方法
  4. centos 6.5 搭建ftp 服务器(vsftpd的配置文件说明)
  5. golang1.8 通过plugin方式build so
  6. 龙芯GO!龙芯平台上构建Go语言环境指南
  7. qt技巧--使用html导出表格替代excel
  8. 漫步Facebook开源C++库Folly之string类设计(散列、字符串、向量、内存分配、位处理等,小部分是对现有标准库和Boost库功能上的补充,大部分都是基于性能的需求而“重新制造轮子”)
  9. 高可用的zookeeper
  10. hgoi#20190514