1.
创建模型
一对多:
需要在""多""的表创建一个""关键字段"" 关联 就像在mysql的哪项少的比如(书与出版社之间在书之间创建一个关联字段public_id 对应着出版社的主键)
语法:在""多的"" 那边添加
1 # 与Publish建立一对多的关系,外键字段建立在多的一方 2 publish=models.ForeignKey(to="Publish",on_delete=models.CASCADE) 3 #publish意味着publish_id 关联字段,无需添加id jdango自动添加 4 #,on_delete=models.CASCADE 级联删除 5 #to="Publish" 指向 少 的
多对多
在mysql中需要创建 一个共同的表,但是在django无需这样
注意:
1 authors=models.ManyToManyField(to="Author") 2 #这里注意 ManyToManyField在django生成的是一个表(记住了) 3 book_author 表里面含有book_id author_id 4 这里无需加级联删除,因为只有一个
一对一
同一对多,唯一区别是 ""关联字段"" 是惟一的 unique
1 ad=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE) 2 这里OneToOneField 在django默认省略 unique 生成字段
创建
查询
1 # 跨表查询,基于对象 2 from app01.models import Book,Publish,Author,AuthorDetail 3 # def books(request): 4 # 一对多添加 5 # 方式一 找出存储的出版社地址为条件,找到对象 然后将publish=找到的对象 6 # pub_obj=Publish.objects.filter(name="云南出版社").first() 7 # Book.objects.create(title="python",price="100",pub_date="2018-10-17",publish=pub_obj) 8 # 方式二 在对象里添加publish_id=对应的主键 9 # Book.objects.create(title="linux", price="100", pub_date="2018-10-17", publish_id=1) 10 # return HttpResponse("OK") 11 # 多对多添加 12 # 方式一 找到要把做作者加入书籍的书籍对象,然后在找到对应作者的主键(也就是找model对象),因为authors也是属性, 13 # 通过 book.authors.add把作者加入 14 # book=Book.objects.filter(title="css").first() 15 # alex=Author.objects.filter(name="alex").first() 16 # egon=Author.objects.filter(name="egon").first() 17 # 方式二 找到要把做作者加入书籍的书籍对象,然后通过book.authors.add() 加入对应的作者的主键数字 18 # book.authors.add(1,2) 19 # 方式三 当你取到的是一串列表的时候,需要一个个去,这里可以应用打散 20 # book.authors.add(*[1, 2]) 21 22 23 24 25 26 ############查询 27 # 一对多 28 # 查询主键为1的书籍的出版社所在的城市 29 # 正向查询 找到主键为一的对象 再通过对象的属性publish 找出 30 # book_obj=Book.objects.filter(nid=1).first() 31 # book_obj是主键为1的书籍对象关联的出版社对象 32 # print(book_obj.publish.email) 33 # 找到云南出版社出版的书 34 # 反向查询 35 # publish_obj=Publish.objects.filter(name="云南出版社") 36 # print(publish_obj.book_set.all()) 37 38 # 多对多 39 # 正向查询 40 # book=Book.objects.filter(title="python").first() 41 # ret=book.authors.all().values("age") 42 # print(ret) 43 # 反向查询 44 # alex=Author.objects.filter(name="alex").first() 45 # print(alex.book_set.all()) 46 47 # 一对一 找对象 没有反向 48 # alex=Author.objects.filter(name="egon").first() 49 # print(alex.ad.addr) 50 51 # ad=AuthorDetail.objects.filter(tel=123).first() 52 # print(ad.author.name) 53 54 # 55 # return HttpResponse("OK")