Django - ORM多对多

作者: 廖马儿 | 来源:发表于2017-10-25 19:53 被阅读83次

    现实生活中多对多的实例有:

    老师 <--> 学生
    

    这个ManyToManyField可以在两个Class的任何一个都无所谓,在数据库中生成的话,都会生成一个表,Class自己表里面却没有字段。只是表名字会有点变化。

    # 多对多设计模式
    
    class Class3(models.Model):
        name = models.CharField(max_length=12)
        c5 = models.ManyToManyField(to=Class5)
    
    class Class5(models.Model):
        name = models.CharField(max_length=12)
    
    
    图片.png

    app06_class3_c5这个表的名称,是Class3中的一个c5字段。
    注意:在app06_class3app06_class5中,都只有idname字段,没有其他字段。那个ManyToManyField字段是在另外一张表中的。
    app06_class3_c5这张表有三个字段:id,class3_id,class5_id

    多对多增加

    from app06 import models as app06_models
    
    # Create your views here.
    
    # 添加数据
    def index(request):
    
        # 先获取Class3表数据
        obj = app06_models.Class3.objects.filter(name="黎明老师").first()
        # 添加关系 将Class3中的实例"黎明老师" 与 Class5的id为1的"小明同学进行关联"
        obj.c5.add(1)
    
        return render(request, "app06/index.html")
    

    也可以向这样添加多个关联:

    obj.c5.add(1,2,3)     # 添加多个关系
    obj.c5.add(*[1,2,3])  # 添加多个关系
    

    然后表中:就会记录下,两个表中的关联如下:


    无论执行多少次index方法,数据库只会有一个关联记录.png

    查询数据

    # 查询数据
    def index3(request):
        obj = app06_models.Class3.objects.filter(name="黎明老师").first()
        c5_gen = obj.c5.all()  # 查出“黎明老师”的所有学生
        for c5 in c5_gen:
            print c5.name
    
        return render(request, "app06/index.html")
    
    

    更新数据

    def index4(request):
    
        # 先获取Class3表数据
        obj = app06_models.Class3.objects.filter(name="黎明老师").first()
        # 更新数据
        obj.c5.set([1, 2, 3])  # 注意:更新这里不是*[1,2,3], 也不可以是  1,2,3。
    
        return render(request, "app06/index.html")
    
    图片.png

    删除数据

    注意:下面列举了三种删除方式
    1)删除某一条
    2)删除多条
    3)删除所有

    # 先获取Class3表数据
    obj = models.Class3.objects.filter(name="xxxx").first()
    
    # 删除单条数据
    # obj.c5.remove(1)
    
    # 删除多条数据
    obj.c5.remove(1,2,3)    # 或者:obj.c5.remove(*[1,2,3])
    
    # 删除所有与当前数据关联的数据
    # obj.c5.clear()
    
    

    相关文章

      网友评论

        本文标题:Django - ORM多对多

        本文链接:https://www.haomeiwen.com/subject/twbuuxtx.html