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)

  

 

  

  

 

  

posted @ 2018-09-08 16:52  brownbearye  阅读(185)  评论(0)    收藏  举报