Django入门开发实战

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

2019-01-06  本文已影响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()         #先清空再设置 
上一篇下一篇

猜你喜欢

热点阅读