zoukankan      html  css  js  c++  java
  • Python学习---django多对多之Djanog默认表学习

    案例一:

    from django.db import models
    class Book(models.Model):
        name = models.CharField(max_length=33)
        # 创建数据,当然不在此处设置,制只做示例演示
        # models.Book.objects.create(name='书名')
    
    class Author(models.Model):
        name = models.CharField(max_length=33)
        # Django此时帮我们生成第三张表
        # 因为没有单独的第三张表的类,所以需要我们间接的操作
        # 通过Book,Author都可以进行操作
        m = models.ManyToManyField("Book")  # 形同虚设,跟Book,Author表都没关系
        # 创建数据,当然不在此处设置,制只做示例演示
        # models.Author.objects.create(name='人名')
    
        # 正向查找数据[先找到人后根据obj.m查找书名]
        # 查询一: 消耗内存
        author_obj = models.Author.objects.get(id=1)
        author_list = author_obj.m.all()  # 获取这个人所写的全部书
        for author in author_list:        # 需要多次查找数据库,很消耗内存
            print(author.name, author.m.all())
        # 查询二: 联表一次查询所有的数据
        author_obj = models.Author.objects.values("id", "m", "name")  # 里面有m这个外键属性
        author_obj2 = models.Author.objects.values("id", "m", "m__name" "name")  # m可以联表取值
        for item in author_list:
            # 查询到全部跟作者有关的书的ID[第三张表关联的就是ID]
            print(item['id'], item['name'], '书籍ID:', item['m'])
        # 反向查找数据
        book_obj = models.Book.objects.get(id=1)  # 先查找到书
        book_obj.author_set.all()   # 间接关联第三张表,查找书的作者
    
        # 数据的添加
        # 正向增加
        obj = models.Author.objects.get(id=1)
        obj.m.add("可以添加Book的对象")  # 不推荐,因为多了一次的查询次数
        obj.m.add(5)  # 第三张表中添加数据[对应关系,表示obj对象关联了M表中id=5这个Book对象]
        obj.m.add(5, 6)  # 第三张表中添加数据[对应关系,表示obj对象关联了M表中id=5/6这个Book对象]
        obj.m.add(*[4, 5])  # 第三张表中添加数据[对应关系,表示obj对象关联了M表中id=4/5这个Book对象]
    
        # 数据的删除
        obj = models.Author.objects.get(id=1)
        obj.m.remove(5)
        obj.m.remove(5, 6)
        obj.m.remove(*[5, 6])
    
        # 数据的清空
        obj = models.Author.objects.get(id=1)
        obj.m.clear()    # 清空obj对象关联的所有数据
    
        # 数据的更新
        obj = models.Author.objects.get(id=1)
        # 必须是迭代对象
        obj.m.set([1, ])     # 此时将book_id设置为1, author_id设置为1[因为获取的Author的ID是1]
        # set里面的值数据库内有则保留,没有则删除
        obj.m.set([1, 4, 5])  # 此时将book_id设置为4,5 author_id设置为1[会删除原来的1]
    
        # 反向操作【其余同上】
        obj = models.Book.objects.get(id=1)
        obj.author_set.add(1)
        obj.author_set.add(1, 2, 3, 4)
        ...
  • 相关阅读:
    C# winform 获取标题栏,状态栏,菜单栏的高度
    <转载>OleDb操作Access数据库:新增记录时获取自动编号的主键值
    《名利场》:微软 “ 失落的十年”
    Lisp的永恒之道(转)
    Google Earth KML数据格式转换成Shp数据格式(转)
    【转】ArcGIS投影转换与坐标转换
    利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)
    C# mouseDoubleClick与DoubleClick的关系
    ACCESS通用操作数据类
    VS2010单元测试入门实践教程
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9403824.html
Copyright © 2011-2022 走看看