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)