ORM操作mysql数据库多表的增删改查

时间:2021-08-29 02:39:32

多表增加

# 一对一
    #查询要被关联的属相对象
    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)