多张表之间的三种关系:一对一,一对多,多对多
创建表
一对一 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']) #删除然后更新