2018-09-08-Python全栈开发day52-django-orm多表操作
1.一对多
设置外键
pub=models.ForeignKey('Publish',on_delete=models.CASCADE) pub为设置外键的名称, Publish为关联的表 on_delete为django2.0之后多的填的内容, CASCADE:此值设置,是级联删除。 PROTECT:此值设置,是会报完整性错误。 SET_NULL:此值设置,会把外键设置为null,前提是允许为null。 SET_DEFAULT:此值设置,会把设置为外键的默认值。 SET():此值设置,会调用外面的值,可以是一个函数。
设置完外键之后,在子表中会生成一个pub_id来与主表的id来进行关联
添加对应关系
b=Book.objects.create(name='java',price=18,pub_date='2017-12-31',pub_id=2) 这种方式可以直接添加带有对应关系的数据
b=Publish.objects.filter(id=2)[0] Book.objects.create(name='C',price=1000,pub_date='2017-12-12',pub=b) 先从主表中获取一行的数据,相当于进行选择, 然后在字表中创建字段的时候,使用外键名称pub来等于这个主表的字段
双下划线查询
使用双下划线来跨表进行查询
可以从filter进行跨表,也可以在values中跨表
主表查询子表内容
b=Book.objects.filter(pub__name='nanjing_publish') 子表通过外键名,加上字段名称作为条件,来搜索主表这条数据所对应在子表中的数据
b=Publish.objects.filter(name='nanjing_publish')[0].book_set.all().values('name') 使用book_set来直接查询子表的内容 所有的查询,都是先找到这个东西,再找到对应的来显示 南京出版社对应的所有书,注意filter是个集合,所以要取出来一个对象 通过book_set直接定位到book这个表
b=Book.objects.filter(pub__name='nanjing_publish').all().values('name') 就是两种用法,一种在filter中,一种在value中 这个是在book也就是子表中,以主表为条件来显示
子表查询主表
根据书来查询对应的出版社
b= Book.objects.filter(name='python').values('pub__name') 这个是最正常的 b=Publish.objects.filter(book__name='python').values('name') 通过fliter来查询
多对多添加表记录
多表操作的原理:
通过第三张表,来专门处理两张表之间的关系
author=models.ManyToManyField('Author') 系统自动创建第三张表,确立两张表之间的关系
绑定多对多的关系
b=Book.objects.filter(name='python')[0] 先找到想加关系的标题数据 c=Author.objects.filter(name='ye')在找到对应的另一个表里的标题 b.author.add(*c)然后加进去
删除多对多关系
方法和绑定类似,只是最后一步
b.author.remove(*c)

浙公网安备 33010602011771号