Django多变关联增加数据删除数据
Posted yangzhizong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django多变关联增加数据删除数据相关的知识,希望对你有一定的参考价值。
建立表之间的关联关系:
models.py里面对表的字段及外键关系的设置如下:
from django.db import models # Create your models here. #出版社表 class Publish(models.Model): nid=models.AutoField(primary_key=True) name=models.CharField(max_length=32) addr=models.CharField(max_length=64) email=models.EmailField() def __str__(self): return self.name #作者表(与AuthorDetail是一对一关系) class Author(models.Model): nid=models.AutoField(primary_key=True) name=models.CharField(max_length=32) age=models.IntegerField() #建立与AuthorDetail一对一关系 authordetail=models.OneToOneField(to=‘AuthorDetail‘,to_field=‘nid‘) def __str__(self): return self.name #作者详细信息表 class AuthorDetail(models.Model): nid=models.AutoField(primary_key=True) phone=models.CharField(max_length=32) email=models.EmailField() def __str__(self): return self.phone #书籍表 class Book(models.Model): nid=models.AutoField(primary_key=True) name=models.CharField(max_length=32) price=models.DecimalField(max_digits=5,decimal_places=2) pub_date=models.DateField() #与出版社绑定一对多关系 publish=models.ForeignKey(to=‘Publish‘,to_field=‘nid‘) #与作者绑定多对多关系(会生成第三张表) authors=models.ManyToManyField(to=‘Author‘) def __str__(self): return self.name
执行后生成的表格关系图,如下:
增加数据:
1.一对一表的增加
#增加 #一对一表的增加(Author--AuthorDetail) #先创建没有外键的数据,即先建作者详细表 # authordetail=AuthorDetail.objects.create(phone=‘3333333‘,email=‘[email protected]‘) # print(authordetail,type(authordetail)) #AuthorDetail object <class ‘app01.models.AuthorDetail‘> # print(authordetail.email) #[email protected] #author建立方式一:手动指定关联authordetail表 # author=Author.objects.create(name=‘作者1‘,age=13,authordetail_id=2) # print(author) #作者1 #author建立方式二:可以传个对象(默认绑定的就是作者详情表里面的最后一条记录) # author = Author.objects.create(name=‘作者2‘, age=13, authordetail=authordetail) # print(author) #作者2 #一对多表的增加(Book--Publish) # Publish.objects.create(name=‘北京出版社‘,addr=‘北京‘,email=‘[email protected]‘) # publish=Publish.objects.create(name=‘南京出版社‘,addr=‘南京‘,email=‘[email protected]‘) # print(publish) #南京出版社 # publish=Publish.objects.create(name=‘广州出版社‘,addr=‘广州‘,email=‘[email protected]‘) # book=Book.objects.create(name=‘在路上‘,price=23.1,pub_date=‘2011-01-23‘,publish=publish) # print(book) #在路上 #注意的点,关联键传的时候要不是手动指定相关表的id号,要不就是只能传对象,例如下面操作: # publish=Publish.objects.filter(name=‘北京出版社‘) #注意这里拿到的是queryset对象 # print(publish) #<QuerySet [<Publish: 北京出版社>]> # publish = Publish.objects.filter(name=‘北京出版社‘).first() #是对象 # print(publish) # 北京出版社 #手动创建一本书去,通过出版社对象.nid 与对象的‘北京出版社’做绑定 # book=Book.objects.create(name=‘你若安好‘,price=23,pub_date=‘1991-1-3‘,publish_id=publish.nid)
2.多对多表的增加
#多对多表的添加add(通过Book、Author2张表,在book_authors表里面录入信息,完成多对多的绑定关系) #方式一:add(作者的id,作者的id) # book=Book.objects.create(name=‘红楼梦‘,price=120,pub_date=‘1891-01-11‘,publish_id=1) # print(book) # print(book.authors.all(),type(book.authors)) #book.authors类型是manager #将红楼梦书绑定作者1、作者2 # res=book.authors.add(1,2) # ret=book.authors.add(*(2,5)) #方式二:add(作者的对象) #第一步:先拿到你想关联的作者的对象 # author=Author.objects.filter(nid=2).first() # print(author) #作者2 #第二步:直接将对象传给add(),即可以将下面书和上面的作者,在第三种表里完成绑定关系并录入 # book=Book.objects.filter(name=‘便是晴天‘).first() #记得传的一定要是对象 # book.authors.add(author)
解除表之间的绑定关系(remove、clear、set)
#解除绑定 # Remove依次删除一条或多条 # book=Book.objects.filter(nid=4).first() # print(book) #手动指定id结果关联 #移除nid=4的书与 nid=2的作者 的绑定 # res=book.authors.remove(2) # print(res) #传对象解除关联 # author=Author.objects.filter(nid=2).first() # book=Book.objects.filter(nid=3).first() # ret=book.authors.remove(author) # print(ret) #None #如果1本书绑定的有多个作者,可以传多个值 # ret=book.authors.remove(2,5) # ret=book.authors.remove(*(2,5)) # clear 一次性全部解除绑定关系 # book = Book.objects.filter(pk=9).first() # book.authors.clear() #set 用法,参数必须传可迭代对象,可以传id,也可以传对象 #方式一:传nid #先解除所有与书nid=3的所有绑定 # book=Book.objects.filter(nid=3).first() # #再建立一个新的与作者nid=3的绑定 # res=book.authors.set([3]) #一定是个可迭代的对象 # print(res) #方式二:传对象 # book=Book.objects.filter(nid=2).first() # #会先执行上面与书2的绑定,再执行下面新的绑定 # author=Author.objects.filter(nid=2).first() #author是个对象 # book.authors.set([author]) #传一个可迭代对象
set( [ 可迭代对象] )的用法图解:
用法一:
#方式一:传nid
#先解除所有与书nid=3的所有绑定
# book=Book.objects.filter(nid=3).first()
# #再建立一个新的与作者nid=3的绑定
# res=book.authors.set([3]) #一定是个可迭代的对象
# print(res)
用法二:
#方式二:传对象 book=Book.objects.filter(nid=2).first() #会先执行上面与书2的绑定,再执行下面新的绑定 author=Author.objects.filter(nid=2).first() #author是个对象 book.authors.set([author]) #传一个可迭代对象
以上是关于Django多变关联增加数据删除数据的主要内容,如果未能解决你的问题,请参考以下文章