zoukankan      html  css  js  c++  java
  • python-day71--django多表操作

    表关系:
             1 一对多
             2 多对多
             3 一对一
                     
                     
    添加记录:
    
         一对多:书与出版社
    
             #创建一对多:
                publish=models.ForeignKey("Publish")
                注意:publish不用写成publish_id,"Publish" 默认找Publish表的主键
             #添加记录方式1:
                models.Book.objects.create(name='红楼梦',publish_id=1)
             #添加记录方式2:
                # pubObj=models.Publish.objects.filter(name="人民出版社")[0]
                # models.Book.objects.create(name='红楼梦',publish=pubObj)  # 关联的出版社对象
    
         多对多:书与作者
    创建多对多关系: authorlist
    =models.ManyToManyField("Author") 多对多添加记录: 先创建Book对象,→ 对象.authorlist.add(作者对象) book_obj=models.Book.objects.create(title="追风筝的人", price=100, publishDate="2017-12-12", publish_id=2) alex_obj=models.Author.objects.filter(name="alex")[0] egon_obj=models.Author.objects.filter(name="egon")[0] book_obj.authorlist.add(alex_obj,egon_obj)
          
    解除多对多关系: 先找到书对象→书对象.authorlist.remove(作者对象) 清除多对多关系: 先找到书对象→书对象.authorlist.clear()
    一对一: 创建一对一关系 创建出版社与出版社详情一对一关系: pubdetail
    =models.OneToOneField('Pubdetail')

      在创建表的关联时 也可以指定哪个表和哪个字段,用 to 的形式
        models.ForeignKey(to="Publish",to_field="nid") 多对多和多对一同理 查询记录: 正向查询: 一对多: linux_obj
    =models.Book.objects.filter(title="linux").first() print(linux_obj.publish.name) # 与这本书对象关联的出版社对象的名字 多对多: 先找到要找的书对象→对象.authorlist.all() linux_obj=models.Book.objects.filter(title="linux").first() print(linux_obj.authorlist.all()) # 与这本书关联的所有作者对象集合 一对一: 查找书的出版社的地址 先找到书对象→出版社对象→出版社对象.pubdetail.addr
    反向查询: book_set 是在创建关系的时候默认创建的,用于反向查询
    #一对多的反向查询: eg:人民出版社出版过的书籍的名字 先找到出版社对象→出版社对象.book_set.all() publish_obj=models.Publish.objects.filter(name="人民出版社")[0] print(publish_obj.book_set.all()) # 与该年出版社关联的所有书籍对象的集合 #多对多的反向查询: 查询yuan出版过的所有书籍的名字和价格: 先找到作者对象→作者对象.book_set.all() author_yuan=models.Author.objects.get(name="yuan") print(author_yuan.book_set.all()) # 与该作者关联的所有书籍书籍对象的集合 #一对一的反向查询:
    查找地址为北京的出版社出版的所有书 出版社详情表的对象.pubdetail.book.all() 注意:在已有记录的表中新增字段时需设置默认值(让已有的记录在该字段显示默认值),并且重新迁移数据库

    
    
    直接赋值:
    通过赋值一个新的可迭代的对象,关联对象集可以被整体替换掉。
    
    >>> new_list = [obj1, obj2, obj3]
    >>> book_obj.author = new_list     
    #直接替换  ,多对一和一对一想换值同样可以使用直接替换 book_obj.publish=new_publish_obj   .....
    如果外键关系满足null=True,关联管理器会在添加new_list中的内容之前,首先调用clear()方法来解除关联集中一切已存在对象的关联。否则, new_list中的对象会在已存在的关联的基础上被添加。
    
    
    
     




    
    
  • 相关阅读:
    Delphi DbgridEh实现鼠标拖动选中列,并使复选框选中
    什么是运行期包与设计期包
    组件事件大全
    sql: 查找约束
    delphi Ctrl+鼠标左键或者Find Declaration不能定位到源文件
    delphi7 编译的程序在win7下请求获得管理员权限的方法
    DELPHI中build和compile有什么区别?
    线程安全的单件模式(单例模式)
    [Selenium]通过Selenium实现在当前浏览器窗口点击一个图标之后,弹出另外一个窗口,关闭这个窗口,再回到原来的窗口进行操作
    两种读写配置文件的方案(app.config与web.config通用)
  • 原文地址:https://www.cnblogs.com/liuwei0824/p/7751905.html
Copyright © 2011-2022 走看看