Django - ORM多对多

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

老师 <--> 学生

这个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)

Django - ORM多对多_第1张图片
图片.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])  # 添加多个关系

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


Django - ORM多对多_第2张图片
无论执行多少次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")
Django - ORM多对多_第3张图片
图片.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多对多)