ORM的多表关系

如果建表时不设置主键,Django会默认添加 一个 id字段,并设为主键
 
对于设置关联的字段,Django会自己动给字段名加"_id" ,默认会关联到主键
 
对models.py  文件的修改,需要做数据迁移才能在数据库生效
python manage.py makemigrations
python manage.py migrate
 
一、对一 
 
1、创建关系
在表中创建外键,在多的一方:
比如在Book里 外键出版社publish
publish=models.ForeignKey("Publish")  
1、ForeignKey指定要关联的 表的类名,如果不指定具体字段,则默认用Publish的主键
2、可以指定具体字段,models.ForeignKey("Publish",to_field="id")
3、数据库的book表中,会增加字段publish_id,字段名的"_id"是Django自己加上的
 
2、添加记录,绑定关系
方式1:
#先找到要关联的obj对象,然后在创建记录时,通过外键字段关联对象
pub_obj=Publish.objects.get(name="人民出版社")
Book.objects.create(title="朝花夕拾",price=22,publish=pub_obj)
 
方式2:
#直接对关联字段赋值,注意是xx_id
Book.objects.create(title="朝花夕拾",price=22,publish_id=3)
 
备注:如果通过实例化创建对象,要在实例化时指定外键字段值
 
3、查询
book_obj.publish     #得到与本书关联的出版社对象,可以接着 点.属性
 
 
 
二、对多 
 
1、创建关系
在其中1个类中,写上关联,会自动创建关系表例如book和author
方式1:(主要)
在Book类里
authors=models.ManyToManyField("Author")   
#1、MangToManyField 指定要关联的表的类名,默认主键关联
#2、Django会在数据库中创建book_authors 表
 
方式2:
新建1个类
class Book2Author(models.Model):
     book=models.ForeignKey("Book")
     Author=models.ForeignKey("Author")
会新生成1个表 Book2Author
 
2、绑定关系
 
add添加 ,remove删除,clear清空
 
方式1:
对象
book_obj.authors.add(auth_obj1,auth_obj2...)
 
方式2:
字段值
book_obj.authors.add(1,2,3..)
 
方式3:
当所有作者都要被关联时
author_lst=Author.objects.all()
book_obj.authors.add(*author_lst)
 
3、查询
book_obj.authors.all()         取到所有关联的对象的QuerySet类型  [obj1.obj2...],模板语言里all不用加括号
author_obj.book_set.all()      可以反着取到作者的所有书籍
 
二、一对一
 
1、创建关系
在任意一个表中建立关系
例如 author 和 authorDetail
方式1:(主要)
通常由author去找authorDetail,所以一般建在author里
ad=models.OneToOneField("AuthorDetail")          
 
方式2:
ad=models.ForeignKey("AuthorDetail",unique=True)
 
2、绑定和查询
和一对多 一样
author.objects(name="alex",ad=AuthorDetail_obj)
author.objects(name="alex",ad_id=AuthorDetail_obj)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2017-12-10 23:21  唐宋元明卿  阅读(421)  评论(0编辑  收藏  举报