django ORM多对多关系使用

一:多对多关系创建

  多对多关系创建:分为两种情况,手动创建和django自动创建

  1)手动创建:自定义关系表 

  通过自定义表,通过models.ForeignKey创建关联

  1. class Host(models.Model):
  2. nid=models.AutoField(primary_key=True)
  3. hostname=models.CharField(max_length=32,db_index=True)
  4. ip=models.GenericIPAddressField(protocol='ipv4',db_index=True)
  5. port=models.IntegerField()
  6. b=models.ForeignKey(to="Business",to_field=("id"))
  7.  
  8. class Application(models.Model):
  9. name=models.CharField(max_length=32)
  10.  
  11. class HostToApp(models.Model):
  12. hobj=models.ForeignKey(to="Host",to_field="nid")
  13. aobj=models.ForeignKey(to="Application",to_field="id")

  2)django自动创建关系表:通过models.ManyToManyField创建第三张表

    第三张表是不可见的,只能通过关联表访问,比如:Application.r.XX

  1. class Host(models.Model):
  2. nid=models.AutoField(primary_key=True)
  3. hostname=models.CharField(max_length=32,db_index=True)
  4. ip=models.GenericIPAddressField(protocol='ipv4',db_index=True)
  5. port=models.IntegerField()
  6. b=models.ForeignKey(to="Business",to_field=("id"))
  7.  
  8. class Application(models.Model):
  9. name=models.CharField(max_length=32)
  10. r=models.ManyToManyField("Host") #多对多

  两种方式都使用,当关系需要增加其他列的时候,第一种方式(可定制)。方式二,只有两个关联表的ID,没有其他字段,如果需要补充其他字段,使用方式1

二:多对多关系数据操作

  方式1:HostToApp.objects.create(hobj_id=1,aobj_id=1)

  方式2:无法直接对第三张表进行操作

    先创建关系对象,通过对象访问等

  1. 第三张表操作
  2. #增加
  3. obj.r.add(1)表示在第三张表里增加了一个1
  4. obj.r.add(2)
  5. obj.r.add(234)
  6. obj.r.add(*[123]) #列表数据需要在前面加*号
  7. #删除
  8. obj.r.remove(1)
  9. obj.r.remove(2,3)
  10. obj.r.remove(*[123])
  11.  
  12. #清空对应关系为1的所有数据
  13. obj.r.clear()
  14.  
  15. #obj.set([3,5,6]) 如果这样设置,数据库里只有3,5,6,其他都被删除
  16.  
  17.   obj.set([3,5,6])
  1.   #obj.r.all() 所有相关主机对象queryset
      obj.r.all() #页面要循环访问数据
  1.  

  示例

  1. def app(request):
  2. app_list=Application.objects.all()
  3. for app_tmp in app_list:
  4. print(app_tmp.name,app_tmp.r.all())
  5. return render(request,"app.html")
  6.  
  7. --------------------------
  8. CDA <QuerySet [<Host: Host object>, <Host: Host object>]>
  9. DBA <QuerySet [<Host: Host object>]>
  10.  
  11. def app(request):
  12. app_list=Application.objects.all()
  13. # for app_tmp in app_list:
  14. # print(app_tmp.name,app_tmp.r.all())
  15. return render(request,"app.html",{"app_list":app_list})
  16.  
  17. <table border="1px">
  18. <thead>
  19. <tr>
  20. <td>应用名称</td>
  21. <td>应用主机列表</td>
  22. </tr>
  23. </thead>
  24. <tbody>
  25. {% for app in app_list %}
  26. <tr>
  27. <td>{{ app.name }}</td>
  28. <td>{% for r in app.r.all%} <~-- 循环访问第三张表里数据-->
  29. <span>{{ r.hostname }}</span>
  30. {% endfor %}
  31. </td>
  32. </tr>
  33. {% endfor %}
  34. </tbody>
  35. </table>

15)django-ORM(多对多关系)的更多相关文章

  1. Django中多对多关系的orm表设计

    作者的管理 1.设计表结构 出版社 书籍 作者 一个出版社出版多个书籍  1对多 书籍和作者的关系:一个作者写多本书,一本书可以是多个作者写.多对多 1)创建一张表,表中多对多的数据关系.使用 多对多 ...

  2. Django 之多对多关系

    1. 多对多关系 作者 <--> 书籍 1. 表结构设计 1. SQL版 -- 创建作者表 create table author( id int primary key auto_inc ...

  3. Python - Django - ORM 多对多表结构的三种方式

    多对多的三种方式: ORM 自动创建第三张表 自己创建第三张表, 利用外键分别关联作者和书,关联查询比较麻烦,因为没办法使用 ORM 提供的便利方法 自己创建第三张表,使用 ORM 的 ManyToM ...

  4. Linux下开发python django程序(django数据库多对多关系)

    1.多对多关系数据访问 models.py设置 from django.db import models # Create your models here. sex_choices=( ('f',' ...

  5. Django ORM的继承关系

    ORM中通常将对象引用映射到外键,但是对于继承,关系数据库中没有自然有效的方法来对应.从数据存储的角度来看,在映射继承关系时,可以采用几种方式(参考JPA中的InheritanceType.定义): ...

  6. django 的多对多关系

    django里自带的多对多表创建 其实就是两个多对一关系各自关联,在第三张表上 多对多的增加 add()可以传数值 例如 add(1)或数组 add(*[2,3]) 多对多反向操作 自己创建第三张表, ...

  7. Django ORM 多对多操作 使用聚合函数和分组 F查询与Q查询

    创建表 # models.py form django.db import models class Book(models.Model): # 表名book,django会自动使用项目名+我们定义的 ...

  8. Python - Django - ORM 多对多操作

    models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...

  9. django ORM多对多操作

    创建多对多: 方式一:自定义关系表 class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = mode ...

  10. django ORM多对多正向查询时查询返回结果为None

    表 class Books(models.Model): '''书籍''' id = models.AutoField(primary_key=True) name = models.CharFiel ...

随机推荐

  1. adb.exe已停止工作

    提示adb.exe错误,我电脑上没有安装豌豆荚,也没运行其它应用,最后发现是360杀毒软件导致的,进程中关掉360Mobile即可.

  2. 十一、移植优化---CONFIG 优化进 menuconfig(1)

    在移植 JZ2440 中,include/configs/jz2440.h 中有很多config 项都是已经在 uboot 的主配置中已经存在了的,这些配置造成了重复,需要优化. 先将原先的 smdk ...

  3. crosstool-ng编译交叉工具链

    一.准备工作 1. 建立工作文件夹 2.下载crosstool-ng git clone https://github.com/crosstool-ng/crosstool-ng crosstool- ...

  4. 【python小练】0011题

    第 0011 题: 敏感词文本文件 filtered_words.txt,里面的内容为以下内容,当用户输入敏感词语时,则打印出 Freedom,否则打印出 Human Rights. #word.tx ...

  5. Listener 快速开始

    [SessionListener] @WebListenerpublic class SessionListener implements HttpSessionListener,HttpSessio ...

  6. clam安装

    nodejs下,npm安装clam指令: npm  install  -g  clam

  7. 第27月第27天 https

    1.验证签名 { [self generateRSAKeyPair:kRSA_KEY_SIZE]; NSData *ttDt = [" dataUsingEncoding:NSASCIISt ...

  8. Centos 04 基础系统优化命令

    在Linux这个系统当中,几乎所有的硬件设备文件都在/dev这个目录内.举例来说,IDE介面的硬盘的文件名称即为/dev/hd[a-d],其中, 括号内的字母为a-d当中的任意一个,亦即有/dev/h ...

  9. Django REST framework 第五章 Relationships & Hyperlinked APIs

    到目前为止,API内部的关系是使用主键来代表的.在这篇教程中,我们将提高API的凝聚力和可发现性,通过在相互关系上使用超链接. Creating an endpoint for the root of ...

  10. drawImg、x5浏览器、react