• day056 多表增加和查询


    今日总结:

    多表的增删改查操作

    多表操作

    book
    id title book_detail publish author
    onetoone manytoone manytomany

    book_obj = models.Book.objects.create(
    title='xx',
    #book_detail_id = 1,
    book_detail = BookDetail(),

    )
    book_obj.author.add(*[1,2])


    book_obj = models.Book.objects.filter(id=2)[0]
    book_obj.author.clear()
    book_obj.author.remove(*[1,2])
    book_obj.author.set([1,2])
    models.Book.objects.filter(id=2).delete()


    models.Book.objects.filter(id=2).update(
    publish_id = 2,
    )
    book_obj = models.Book.objects.filter(id=2)[0]

    book_obj.author.set([1,2])


    一对多的基于对象的正反向查询:
    查询主键为1的书籍的出版社所在的城市
    models.Book.objects.filter(id=1)[0].publish.addr
    models.Publish.objects.get(name='18期出版社').book_set.values('title')

    一对一的基于对象的正反向查询:
    查询一下骚小强的电话
    正向
    models.Author.objects.get(name='骚小强').au.tel
    反向
    models.AuthorDetail.objects.get(tel='222').author.name

    多对多的基于对象的正反向查询:
    水浒传这本书有几个作者参与撰写了

    正向:
    models.Book.objects.get(title='水浒传').authors.values('name')

    反向:
    models.Author.objects.get(name='骚小强').book_set.values('title')


    一对多的基于双下划线的正反向查询:

    查询主键为1的书籍的出版社所在的城市
    models.Book.objects.filter(id=1).values('publish__addr')
    models.publish.objects.filter(book__id=1).values('addr')
    一对一的基于双下划线的正反向查询:
    查询一下骚小强的电话
    models.Author.objects.filter(name='骚小强').values('au__tel')
    models.AuthorDetail.objects.filter(author__name='骚小强').values('tel')

    多对多的基于双下划线的正反向查询:

    水浒传这本书有几个作者参与撰写了
    models.Book.objects.filter(title='水浒传').values('authors__name')
    models.Author.objects.filter(book__title='水浒传').values('name')


    聚合查询:aggragate()

    models.Book.objects.all().aggragate(Avg('price'))

    分组: annotate() group by

    models.Author.objects.values('id','name').annotate(c=Count('book__id'))

    models.Author.objects.filter(Q(age__gt=20)&Q(id__gt=20),name='xxx').annotate(c=Count('book__id')).values('name','c');



    1.一对一关系

      models.onetoonefield(to=要关联的表名,to_field='关联的字段')

    2.一对多关系

      models.foreignkey(to='要关联的表名',to_field='要关联的字段') 

    注意:一对一和一对多关系删除时要注意,设置里foreignkey后,要设置级联删除' on_delete=models.CASCADE '

    3.多对多关系

      models.manytomanyfield('to'='要关联的表名')

    增加:

      pub_obj=models.publish.objects.fillter(id=n)[0]

      多对一插入数据方式1:

        models.book.objects.create(

        title='水浒传',

        publisher=pub_obj,

        )

      多对一插入数据方式2:

        models.book.objects.create(

           title='三国演义',

           publish_id=1,

        )

    一对一插入数据方式:

      models.book.objects.create(

      ...,

      ...,

      )

    多对多插入数据方式 : 文字描述(首先你要先找到一个具体的对象,然后用这个对象去点那个你要关联的表名,然后点add()把你要插入的东西插入进去 )

      方式一

      #首先先找到一个具体的对象

      book_obj=models.book.objects.get(id=1)

      #

      hh_obj=models.book.objects.get(id=xxx)

      #添加数据

      book_obj.关联的那个表名.add(hh_obj)

      方式二

      book_obj.表名.add(*[1,2])

      book_obj.表名.add(1,2)

    一对一

      正向查询: 对象.另一个表名.字段名

      反向查询: 对象.另一个表名.字段名 

    一对多

      正向查询: 对象.另一个表的表名.字段名

      反向查询: 对象.另一个表的表名_set.all().values(id=xx)

    多对多

      正向查询: 对象.另一个表的表名.all()

      反向查询: 对象.另一个表的表秒_set.all()

  • 相关阅读:
    力扣leetcode 435. 无重叠区间
    C++中的快读和快写
    python安装wordcloud库报错
    python习题 随机密码生成 + 连续质数计算
    python 四位玫瑰数 + 100以内素数求和
    解决git add README.md 时报错 fatal: pathspec 'README.md' did not match any files
    洛谷P3817 小A的糖果 贪心思想
    多机部署之session共享解决方案-copy
    一点区块链资料-copy
    kafka集群搭建及结合springboot使用-copy
  • 原文地址:https://www.cnblogs.com/zty1304368100/p/10453695.html
Copyright © 2020-2023  润新知