Django学习手册 - ORM 多对多表

定义表结构:

class Host(models.Model):
    hostname = models.CharField(max_length=32)
    port = models.IntegerField()

class HostAdmin(models.Model):
    username = models.CharField(max_length=32)
    email = models.CharField(max_length=32)
    host = models.ManyToManyField(Host)
  #这条语句输入以后,会自动创建一个表。这里自动创建的表名为 app01_hostadmini_host,也就是第三张截图的表。

添加数据:

hostadmin表

 host表

 hostadmin_host 表

多表操作(正向查找 hostadmin表 → host表):

def index(request):
    # 添加/关联数据:
    #(找到第一张表的一条数据,然后再找到第二张表的数据,然后关联)
    # 方式一:
    # #admin表的一条数据
    # admin_obj = models.HostAdmin.objects.get(username='A1')
    # #host表中的一条数据
    # host_list = models.Host.objects.filter(id__lt=4)
    # #通过admin多对host键add增加
    # admin_obj.host.add(*host_list)
    #第二张表的数据之间关联第一张表的数据

    # 方式二:
    # obj = models.HostAdmin.objects.filter(id=2)
    # obj.host.add(2)
    #单个
    #
    # obj.host.add(3, 4)
    #元组
    #
    # obj.host.add(*[2,3,4,5])
    #字典
    #通过id进行关联,id=2的数据关联第二张表的id 2 ,id 3 ,id 4,id 5

    # 删除数据
    # obj.host.remove(1)
    # obj.host.remove(2,3)
    # obj.host.remove(*[1,2,3,4])

    # 清除数据
    # obj.host.clear()

    # 更新数据
    # obj.set([3,4,5])
    # 注意,这样配置了以后,就只剩3,4,5 数据条目了,其他都被清除了。

    # 单条查询
    # admin_obj = models.HostAdmin.objects.get(username='A1')
    # # print(admin_obj.host.all())
    # for i in admin_obj.host.all():
    #     print(i,i.hostname)

    #查询所有
    # admin_all_obj = models.HostAdmin.objects.all()
    # for i in admin_all_obj:
    #     print(i.username)
    #     print("-"*3)
    #     for i2 in i.host.all():
    #         print(i2.hostname)
    #     print("*"*10)
    #i.host.all()也是obj对象,要取得其中的数据用嵌套for循环。

    return HttpResponse("OK")

 单条查询 结果:

查询所有 结果:

小结:

ORM多表操作,通过定义的 :host = models.ManyToManyField(Host),进行跨表操作。★★★★

 反向查询(待续)

猜你喜欢

转载自www.cnblogs.com/Anec/p/9543369.html