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多对多

    现实生活中多对多的实例有: 这个ManyToManyField可以在两个Class的任何一个都无所谓,在数据库中生...

  • django下orm学习 多对多

    前言:多对多的关系简单来说就是两张表里的数据,每一行都可以对应另外一张表里的多行数据。采用我们在一对多时使用的例子...

  • Django - ORM 一对多,多对多操作

    django中的一对一,一对多,多对多 http://www.cnblogs.com/pythonxiaohu/p...

  • django下orm学习 一对多

    概念说明 ORM:关系对象映射的全称是 Object Relational Mapping, 简称ORM SQLA...

  • Django——多对一关系

    Django的ORM中,有多种关系,例如多对一,一篇文章只能有一个作者,但是一个作者可以写多篇文章,这样就形成了多...

  • Django Model

    django的模型挺好的,不用自己写SQL。外键,多对多,一对多,多对一。 参考:Django Project

  • django 多对多模型

    文集和文章之间的关系是一个典型的多对多关系(购物车和商品的关系也是是一样),用关系型数据库可以很好的处理,需要有一...

  • mysql ---多对多

    flask的orm框架(SQLAlchemy)-一对多查询以及多对多查询(venv) $ pip install...

  • Python全栈 part02 - 006 Django(二)

    ORM 创建表(class) 单表 关联表 一对一 OneToOne 一对多 ForeignKey 多对多 ...

  • Django 原生多对多查询

    拿到所有的数据库分类

网友评论

    本文标题:Django - ORM多对多

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