美文网首页Django入门开发实战
Django模型层之多表操作(二)

Django模型层之多表操作(二)

作者: 乔治大叔 | 来源:发表于2019-01-06 23:40 被阅读5次

    添加表记录

    一对多的

    方式1:
       publish_obj=Publish.objects.get(nid=1)
       book_obj=Book.objects.create(title="",publishDate="2012-12-12",price=100,publish=publish_obj)
      
    方式2:
       book_obj=Book.objects.create(title="",publishDate="2012-12-12",price=100,publish_id=1)
    
    关键点:
    
        一 book_obj.publish=Publish.objects.filter(id=book_obj.publish_id).first()
    
        二 book_obj.authors.all()
           关键点:book.authors.all()  # 与这本书关联的作者集合
    book.id=3
    book_authors
                id  book_id  author_ID
         3             1
         3             2
     author
               id   name
      alex
      egon
    
        book_obj.authors.all()    ------->   [alex,egon]
    
    # -----一对多添加
        pub=Publish.objects.create(name='egon出版社',email='445676@qq.com',city='山东')
        print(pub)
    
        # 为book表绑定和publish的关系
        import datetime,time
        now=datetime.datetime.now().__str__()
        now = datetime.datetime.now().strftime('%Y-%m-%d')
        print(type(now))
        print(now)
        # 日期类型必须是日期对象或者字符串形式的2018-09-12(2018-9-12),其它形式不行
        Book.objects.create(name='海燕3',price=333.123,publish_date=now,publish_id=2)
        Book.objects.create(name='海3燕3',price=35.123,publish_date='2018/02/28',publish=pub)
        pub=Publish.objects.filter(nid=1).first()
        book=Book.objects.create(name='测试书籍',price=33,publish_date='2018-7-28',publish=pub)
        print(book.publish.name)
        # 查询出版了红楼梦这本书出版社的邮箱
        book=Book.objects.filter(name='红楼梦').first()
        print(book.publish.email)
    

    多对多

    # 当前生成的书籍对象
        book_obj=Book.objects.create(title="追风筝的人",price=200,publishDate="2012-11-12",publish_id=1)
        # 为书籍绑定的做作者对象
        yuan=Author.objects.filter(name="yuan").first() # 在Author表中主键为2的纪录
        egon=Author.objects.filter(name="alex").first() # 在Author表中主键为1的纪录
    
        # 绑定多对多关系,即向关系表book_authors中添加纪录
        book_obj.authors.add(yuan,egon)    #  将某些特定的 model 对象添加到被关联对象集合中。   =======    book_obj.authors.add(*[])
    
    book = Book.objects.filter(name='红楼梦').first()
        egon=Author.objects.filter(name='egon').first()
        lqz=Author.objects.filter(name='lqz').first()
        # 1 没有返回值,直接传对象
        book.authors.add(lqz,egon)
        # 2 直接传作者id
        book.authors.add(1,3)
        # 3 直接传列表,会打散
        book.authors.add(*[1,2])
        # 解除多对多关系
        book = Book.objects.filter(name='红楼梦').first()
        # 1 传作者id
        book.authors.remove(1)
        # 2 传作者对象
        egon = Author.objects.filter(name='egon').first()
        book.authors.remove(egon)
        #3 传*列表
        book.authors.remove(*[1,2])
        #4 删除所有
        book.authors.clear()
        # 5 拿到与 这本书关联的所有作者,结果是queryset对象,作者列表
        ret=book.authors.all()
        # print(ret)
        # 6 queryset对象,又可以继续点(查询红楼梦这本书所有作者的名字)
        ret=book.authors.all().values('name')
        print(ret)
        # 以上总结:
        # (1)
        # book=Book.objects.filter(name='红楼梦').first()
        # print(book)
        # 在点publish的时候,其实就是拿着publish_id又去app01_publish这个表里查数据了
        # print(book.publish)
        # (2)book.authors.all()
    

    多对多关系其它常用API:

    book_obj.authors.remove()      # 将某个特定的对象从被关联对象集合中去除。    ======   book_obj.authors.remove(*[])
    book_obj.authors.clear()       #清空被关联对象集合
    book_obj.authors.set()         #先清空再设置 
    

    相关文章

      网友评论

        本文标题:Django模型层之多表操作(二)

        本文链接:https://www.haomeiwen.com/subject/xhtyrqtx.html