ORM创建多表以及多表的增删改查

一. 多表的创建

  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()

    

猜你喜欢

转载自www.cnblogs.com/q767498226/p/10454152.html