一: 一对多
1. 一对多新增
两种方式: publish = 对象 publish_id = id
1. publish_id 和 publish 的区别就是:
1)publish_id 可以手动输入要查询的书籍的出版社 如: 方式一
2)publish 要查询书籍出版社需要从数据库中取出出版社对象, 如: 方式二
# 一对多新增数据 # 添加一本北京出版社出版的书 # 方式一 ret = Book.objects.create(name='妈妈再爱我一次', price=25, publish_id=1) print(ret.name) # 方式二, 存对象publish=出版社的对象,存到数据库,是一个id # publish=Publish.objects.get(id=2) # publish=Publish.objects.get(pk=2) # pk 和 id 的作用一样,都是主键,可以通过主键查找,主键只有一个 # 如果用filter 必须在后面加一个 .first() publish = Publish.objects.filter(pk=2).first() # 从数据里面取出出版社对象 ret = Book.objects.create(name='爸爸再爱我一次', price=35, publish=publish) print(ret.name)
2. 一对多修改: 学习了单表操作,新增数据这一些,和修改数据是一个意思
# 一对多修改数据 # 方式一: book = Book.objects.get(pk=1) # book.publish=出版社对象 book.publish_id = 2 book.save() # 方式二 # book=Book.objects.filter(pk=1).update(publish=出版社对象) # book=Book.objects.filter(pk=1).update(publish_id=1)
3. 一对多删除: 删除数据就是直接删除就可以了,不过删除大数据要谨慎,能虚就虚,不然就要删库跑路了
二: 多对多
- 多对多常用的API
# book_obj.authors.add() 添加
# book_obj.authors.remove() 特定的关联对象从集合中去除, 比如说,移除某书籍的作者
# book_obj.authors.clear() 清空所有书籍的作者
# book_obj.authors.set() 先清空,再设置
1. 多对多新增,add
# 多对多新增(书籍跟作者的关系) # 1. 为妈妈再爱我一次这本书新增一个叫prince, bp 的作者 # prince = Author.objects.filter(name='prince').first() # 拿到作者这个对象 # bp = Author.objects.filter(name='bp').first() # 新增两个作者 book = Book.objects.filter(name='妈妈再爱我一次').first() # 要新增就要查到这本书 # add 添加多个对象 对象用逗号隔开 # book.author.add(prince, bp) # 书籍表的authors # add 添加作者id book.author.add(1, 2)
2. 多对多删除,remove
# 多对多新增(书籍跟作者的关系) # prince = Author.objects.filter(name='prince').first() # 拿到作者这个对象 # book = Book.objects.filter(name='妈妈再爱我一次').first() # 要新增就要查到这本书 # # 删除 remove ,可以传对象, 可以传id, 也可以传多个,但不要混着用 # 删除一个叫prince的作者 # book.author.remove(prince) # book.author.remove(2) book.author.remove(1, 2)
3. 清空, clear
# 清空 clear,清空所有,不需要传参数 book.author.clear()
4. 先清空, 在新增 set
# 先清空,在新增 set , book.author.set(2) # 注意: 这样是错误的, 打印时会出现 TypeError: 'int' object is not iterable 这样的错误, 我们必须传一个可迭代的对象出来, 改成下面这样,就可以了
# 要传一个列表,列表内可以是id, 也可以是对象 book.author.set([2, ])
2.
2.
2.