zoukankan      html  css  js  c++  java
  • ORM操作mysql数据库多表的增删改查

    多表增加

    # 一对一
    	#查询要被关联的属相对象
        au_obj = models.AuthorDetail.objects.get(id=4)
        models.Author.objects.create(
            name='海狗',
            age=59,
            #方式一:直接通过数据库的字段名au_id增加,一对一时,数据必须是没有关联过的,否则会报错
            au_id=4,
            #方式二:通过属性models类的属性添加,首先要查出要关联的对象,然后通过属性关联,一对一数据必须未关联
            au=au_obj,)
    #一对多
        pub_obj = models.Publish.objects.get(id=3)
        models.Book.objects.create(
            title='xx2',
            price=13,
            publishDate='2011-11-12',
            #方式一:直接通过数据库的字段名au_id增加,如果关键字为数据库字段名称,那么值为关联数据的值
            publishs_id=3,
            #方式二:通过属性models类的属性添加, #类属性作为关键字时,值为model对象 
            publishs=pub_obj,)
     #多对多
    	多对多添加数据是在中间表中添加关联,只能通过属性操作
        #查找要关联的作者
        ziwen = models.Author.objects.get(id=3)
        haigou = models.Author.objects.get(id=5)
    
        new_obj = models.Book.objects.create(
                title='海狗产后护理第二部',
                price=0.5,
                publishDate='2019-09-29',
                publishs_id=2,
        )
    	#方式一*:
        new_obj.authors.add(3, 5)
        #方式二:
        new_obj.authors.add(*[3, 5])  # 用的最多,
        #方式三:
        new_obj.authors.add(ziwen, haigou)
    

    多表删除

    #一对一
    	#删除被关联表的数据,级联删除,会自动删除关联表中的数据,如果没有设置级联删除,就不会删除关联表中的数据
        models.AuthorDetail.objects.filter(id=3).delete()
    	#通过外键表删除,只会删除自己的数据,被关联表中的数据不会删除
        models.Author.objects.filter(id=3).delete()
    #一对多(和一对一的一样)
        models.Publish.objects.filter(id=3).delete()
        models.Book.objects.filter(id=4).delete()
    
    #多对多
    	#多表删除只能通过删除中间表的关联信息,来消除关联,
        #获取要消除关联的数据,(书籍)
        book_obj = models.Book.objects.get(id=2)
        #删除于书籍book_obj相关的作者id为1的作者
        book_obj.authors.remove(1)  #删除
        #清除所有于书籍book_obj相关的关联数据
        book_obj.authors.clear()  # 清除
        #重新设置于书籍book_obj相关的关联作者信息
        book_obj.authors.set(['1','5'])  # 先清除再添加,相当于修改
    

    多表修改

    #orm表中的关联是关联id字段,所以修改字段数据,不会影响关联关系,就是单表修改数据
        ret = models.Publish.objects.get(id=2)
        models.Book.objects.filter(id=5).update(
            #通过属性来修改字段值
            title='华丽丽',
            publishs=ret,
            #通过数据库字段来修改值
            publishs_id=1,
        )
    #多对多修改,是修改中间表的数据,来设置关联关系,通过set设置
    	#重新设置于书籍book_obj相关的关联作者信息
    	book_obj.authors.set(['1','5'])  # 先清除再添加,相当于修改
    

    多表查询

    #一对一查询:
    # 关系属性写在表1,关联到表2,那么通过表1的数据去找表2的数据,叫做正向查询,返过来就是反向查询	
    #正向查询:
    	obj = models.Author.objects.filter(name='王洋').first()
        #正向查询,通过属性查找,会自动查找被关联表中的数据字段,对象.属性
    	ph = obj.au.telephone
        # 反向查询会自动查找关联表中的数据字段,对象.属性对象.小写的表名
        obj = models.AuthorDetail.objects.filter(telephone=120).first()
        ret = obj.author.name
        print(ret)
    #一对多:
    	#正向查询:
        obj = models.Book.objects.filter(title='海狗的怂逼人生').first()
        ret = obj.publishs.name
        #反向查询:
        #一堆多的情况下,反向查询是从关联表的数据查找被关联表中的数据,可能是多条数据,
        obj = models.Publish.objects.filter(name='24期出版社').first()
        #表名后面加__set就是可能查找到多条数据时使用,通过all的方式获取所有查询到的结果
    	ret = obj.book_set.all() #查询到的是QuerySet对象
        #通过foe循环,查看每个结果的字段值
    	for i in ret:
        	print(i.title)
    #多对多:
        #正向查询:建表时的关系属性写在那个表中,通过这个表去查询,就是正向查询
    	obj = models.Book.objects.filter(title='海狗的怂逼人生').first()
    	ret = obj.authors.all()
        #反向查询:
        查询一个作者写了多少书
        obj = models.Author.objects.filter(name='海狗').first()
        ret = obj.book_set.all()
        for i in ret:
            print(i.publishs.name)
            print(i.title)
    
  • 相关阅读:
    POJ_1523 SPF (Tarjan 求割点)
    POJ 3177&& 3352
    POJ 基础数据结构
    Bellman Ford, SPFA 学习笔记(含有负权的单源最短路径)
    HDU_3062 Party (2SAT)
    POJ二分图最大匹配的简单题目
    POJ 2553 The Bottom of a Graph (Trajan 强连通分量 缩点)
    POJ_3678 Katu Puzzle (2SAT)
    HDU_3836 Equivalent Set (Trajan 强连通分量 缩点)
    POJ1904 King's Quest(Tarjan 求缩点)
  • 原文地址:https://www.cnblogs.com/luckinlee/p/11622299.html
Copyright © 2011-2022 走看看