九、ORM中的一对多,多对多的增删改查

模型之间的三种关系:一对一,一对多,多对多。
一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性;
一对多:就是主外键关系;(foreign key)
多对多:(ManyToManyField) 自动创建第三张表(当然我们也可以自己创建第三张表:两个foreign key)

查询操作:

一对多查询,多对多查询:

注意, 多对多:(ManyToManyField) 自动创建第三张表(当然我们也可以自己创建第三张表:两个foreign key),所以,2张表要有关联,中间表里面必须要有值,中间表的值可以手动填写,也可以通过django web 让其自动填写

我们在views.py中更改查询相关代码:

def list(request):
    _class = "docker班"
    #obj_li = models.Class.objects.filter(name=_class) #querset_list
    obj = models.Class.objects.filter(name=_class).first() #querset
    print("一对多拿值,根据班级,拿学校的数据")
    print(obj.name,obj.sch.name)
    print("多对多拿值,根据班级,拿用户数据")
    #print (obj.user.filter(name=_class).first())
    for i in obj.user.all():
       print (i.username)

输入:http://127.0.0.1:8080/api/list.html
控制台会返回:
一对多拿值,根据班级,拿学校的数据
docker班 清华
多对多拿值,根据班级,拿用户数据
xianrenqiu

反向查询:

已知 用户的名字是linux,查询对应的班级。
def list(request):
    user_obj = models.Userinfo.objects.filter(name='linux').first()
    for item in user_obj.class_set.all():
        print (item.name)

页面输入:http://127.0.0.1:8080/api/list.html
可以得到班级为:python班

增加操作:

一对多的增加:

操作也是比较简单的

def add(request):
    obj=models.School.objects.create(name='湖南大学')
    obj_cla=models.Class.objects.create(name='市场营销',sch=obj)
    obj_cla1=models.Class.objects.create(name='酒店管理',sch=obj)
    print ("一对多增加,跨表查到了学校")
    print (obj,obj_cla.sch.name,obj_cla1.sch.name)

页面输入:http://127.0.0.1:8080/api/add.html
控制台输出:
一对多增加
湖南大学 湖南大学 湖南大学

增加的大学:湖南大学,湖南大学增加的班级:市场营销,酒店管理

多对多增加:

操作的是中间表
用户表和中间表,我们增加2张表之间的关系表user_class字段

user_obj= models.Userinfo.objects.create(name="多对多测试",username='test')
class_obj.user.add(user_obj.id)

也可以查询匹配到2张表的字段然后增加关系表字段:

def add(request):
    class_name="linux班"
    class_obj = models.Class.objects.filter(name=class_name).first()
    user_obj= models.Userinfo.objects.filter(name='网络')
    class_obj.user.add(*user_obj)

页面输入:http://127.0.0.1:8080/api/add.html
中间表增加:
在这里插入图片描述

反向增加:

反向增加2张表的关联关系,

def add(request):
    class_obj = models.Class.objects.filter(name='计算机班')
    user_obj = models.Userinfo.objects.filter(name='linux').first()
    #反向增加2张表的关联关系
    user_obj.class_set.add(*class_obj)

反之想要反向删除:
其他不变,只需要改变执行方法

 user_obj.class_set.move()

删除操作:

删除就是匹配到相关的字段,然后执行删除方法就能删除

def delete(request):
    _class = '市场营销'
    models.Class.objects.filter(name=_class).delete()

输入:http://127.0.0.1:8080/api/delete.html
控制台没打印,所以没输出,但是数据库中已经把数据删除了

一对多删除:

	     models.Class.objects.filter(sch__name='湖南大学').delete()

此时就能把湖南大学下面所有班级删掉

多对多的删除:

操作的是中间表
格式跟增加一样,所用的方法时move()

def delete(request):
    class_name="linux班"
    class_obj = models.Class.objects.filter(name=class_name).first()
    user_obj= models.Userinfo.objects.filter(name='网络')
    class_obj.user.remove(*user_obj)

输入:http://127.0.0.1:8080/api/delete.html
可以删除掉对应2张表的关系。

修改操作:

修改跟删除一样,反之删除跟修改也一样,只是一个调用的是delete,一个调用的是update,其他都是一样的,

一对多修改,(删除类似):

def update(request):
    #sch__name代表跨表查询,将学校名为清华的班级名全部改为计算机
    models.Class.objects.filter(sch__name='清华').update(name='计算机')

访问:http://127.0.0.1:8080/api/update.html
跟清华关联的班级,全部改名为计算机了

多对多修改:

修改的关系表,clear方法是先把 班级表里面所有跟linux班所有的关系先清掉,然后重新添加

def update(request):
    class_name = "linux班"
    class_obj = models.Class.objects.filter(name=class_name).first()
    user_obj = models.Userinfo.objects.filter(name = "网络")
    #先删后加
    class_obj.user.clear()
    class_obj.user.add(*user_obj)

访问:http://127.0.0.1:8080/api/update.html
关于linux班级id只剩我们操作的这一条。

MyBatis是一款优秀的ORM框架,可以方便地实现数据库的操作。下面是一对多增删改查的示例: 一对多关系指的是一个实体对象关联多个子实体对象,比如一个部门对应多个员工。在这种情况下,通常会使用两个表来表示这种关系,一个主表和一个从表,主表包含一条记录,从表包含多条记录。 一对多查询: ```xml <!--部门表--> <resultMap id="departmentMap" type="Department"> <id property="id" column="id" /> <result property="name" column="name" /> <collection property="employees" ofType="Employee"> <id property="id" column="employee_id" /> <result property="name" column="name" /> <result property="age" column="age" /> </collection> </resultMap> <select id="getDepartment" resultMap="departmentMap"> SELECT d.id, d.name, e.id as employee_id, e.name, e.age FROM department d LEFT JOIN employee e ON d.id = e.department_id WHERE d.id = #{id} </select> ``` 一对多新增: ```xml <!--部门表--> <insert id="insertDepartment" parameterType="Department"> INSERT INTO department (name) VALUES (#{name}) </insert> <!--员工表--> <insert id="insertEmployee" parameterType="Employee"> INSERT INTO employee (name, age, department_id) VALUES (#{name}, #{age}, #{department.id}) </insert> ``` 一对多修改: ```xml <!--部门表--> <update id="updateDepartment" parameterType="Department"> UPDATE department SET name = #{name} WHERE id = #{id} </update> <!--员工表--> <update id="updateEmployee" parameterType="Employee"> UPDATE employee SET name = #{name}, age = #{age}, department_id = #{department.id} WHERE id = #{id} </update> ``` 一对多删除: ```xml <!--部门表--> <delete id="deleteDepartment" parameterType="int"> DELETE FROM department WHERE id = #{id} </delete> <!--员工表--> <delete id="deleteEmployee" parameterType="int"> DELETE FROM employee WHERE id = #{id} </delete> ``` 以上是一对多关系的增删改查示例,具体实现还要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值