zoukankan      html  css  js  c++  java
  • ORM的记录添加和删除

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

  • 相关阅读:
    [pycharm]远程调试服务器项目
    [Linux]防火墙关闭与开启
    [Linux]安装pyenv
    [Linux]ubuntu安装基本流程
    [python]html格式转md格式
    [python]目录及文件操作
    [Linux]安装node.js
    Linux基础
    爬虫基础(3)
    爬虫基础(2)
  • 原文地址:https://www.cnblogs.com/kenD/p/9866868.html
Copyright © 2011-2022 走看看