多张表之间的三种关系:一对一,一对多,多对多
创建表
一对一
xx = models.OneToOneField(to='表明',to_field='字段名',on_delete=models.CASCADE)
#删除时的一些级联效果,to_field可以不写,默认是关联到另一张表的主键,on_delete在1.x版本的django中不用写,默认是级联删除,2.x版本的django要写
一对多
xx = models.Freignkey(to='表名',to_field='字段名',on_delete=models.CASCADE)
多对多
xx = models.ManyToManyField(to='另外一个表明')#只是自动创建第三张表
数据的增删改
增
一对一增加
mew_author_detail = models.AuthorDetail.objects.create(
birthday='1979-08-08',
telephone='13811223344',
addr='黑龙江哈尔滨'
)
obj = models.AuthorDetail.objects.filter(addr='山西临汾').first()
#方式1
models.Author.objects.create(
name='王涛',
age='40',
authorDetail=new_author_detail,
)
#方式2 #常用
models.Author.objects.create(
name='王涛',
age='40',
authorDetail_id=obj.id,
)
#一对多
#方式1
obj = models.Publish.objects.get(id=2)
models.Book.objects.create(
title = '朝花夕拾',
pubilshDate='2019-07-22',
price=3,
publishs=obj,
)
#方式2 常用
models.Book.objects.create(
title='朝花夕拾',
publishDate='2019-07-21',
price=3.5,
publishs_id=obj.id
)
多对多
方式1 常用
book_obj = models.Book.objects.get(id=1)
book_obj.authors.add(*[1,2])
方式2
author1 = models.Author.objects.get(id=1)
author2 = models.Author.objects.get(id=3)
book_obj=models.Book.objects.get(id=5)
book_obj.authors.add(*[author1,author2])
删
一对一和一对多的删除和单表删除是一样的
一对一 表一外键关联到表二,表一删除,不影响表二,表二删除会影响表一
models.AuthorDetail.objects.get(id=2).delete()
mmodels.author.objects.get(id=3).delete()
一对多
models.Pubish.objects.get(id=1).delete()
models.Book.objects.get(id=1).delete()
多对多关系删除
book_obj = models.Book.objects.get(id=6)
book_obj.authors.remove(6)
book_obj.authors.remove(*[5,6])
book_obj.authors.clear() #清空
book_obj.authors.set(['5','6']) #删除然后更新
更新
一对一
models.Author.objects.filter(id=5).update(
name='崔老师',
age=16,
authorDetail_id=4,
)
一对多
models.Book.objects.filter(pk=4).update(
title='B哥的往事2',
publishs_id=3,
)
多对多
book_obj = models.Book.objects.get(id=6)
book_obj.authors.set(['5','6']) #删除然后更新