一. 多表的创建
1. 一对一
在哪个表中设置都行,但是添加数据的时候需要现在没有外键的表中添加数据
models.OneToOneField(to="表名",to_field="id")
2. 一对多
在多的表中创建外键,创建完的这个是外键字段,会在类属性的基础上加_id
models.ForeignKey(to="表名")
3. 多对多
mysql是在第三张表中添加两个外键
orm中不用手动创建第三表,所以外键设置在哪个表中都行,设置完了这个属性不是表字段了,但是这个属性可以查询多对多关联关系
二. 多表的添加
1. 一对一
先创建被关联的,也就是没有外键的,因为不这样哪个表会关联不到数据而报错
第一种根据对象添加
obj = models.被关联表.objects.create(id=xxx,name="xxx")
models.关联表.objects.create(name=xxx,外键=obj)
第二种根据id添加
models.关联表.objects.create(name=xxx,外键=id)
2. 一对多
和一对一一样,只不过一对一的那个外键多了unique的约束
3. 多对多
先添加数据到两个多对多的表,然后用外键属性.add()添加
关联表.外键属性.add(1,2,3)或者add(*[1,2,3])
三. 多表的查询
多表查询的时候,如果 => 指向的是一,拿到的就是对象,=> 指向的是多,拿到的是列表对象
1. 一对一
正向查询 有外键属性 => 没有外键属性
先找到要查询的那一行,然后用外键属性拿到被关联的对象
obj.外键.name
反向查询 没有外键属性 => 有外键属性
先找到要查询的那一行,然后用表名拿到关联的对象
obj.表名.name
2. 多对一
正向查询 多 => 一
先找到要查询的那一行,然后用外键属性拿到被关联的对象
obj.外键属性.name
反向查询 一 => 多
先找到要查询的那一行,然后用表名_set拿到关联的列表对象
obj.表名_set.all()
3. 多对多
正向查询 有外键属性 => 没有外键属性
先找到要查询的那一行,然后用外键属性拿到被关联的列表对象
obj.外键属性.all()
反向查询 没有外键属性 => 有外键属性
先找到要查询的那一行,然后用表名_set拿到关联的列表对象
obj.表名_set.all()