现实生活中多对多的实例有:
老师 <--> 学生
这个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_class3
和app06_class5
中,都只有id
和name
字段,没有其他字段。那个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()
网友评论