django ORM多对多关系使用

一:多对多关系创建

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

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

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

    class Host(models.Model):
nid=models.AutoField(primary_key=True)
hostname=models.CharField(max_length=32,db_index=True)
ip=models.GenericIPAddressField(protocol='ipv4',db_index=True)
port=models.IntegerField()
b=models.ForeignKey(to="Business",to_field=("id")) class Application(models.Model):
name=models.CharField(max_length=32) class HostToApp(models.Model):
hobj=models.ForeignKey(to="Host",to_field="nid")
aobj=models.ForeignKey(to="Application",to_field="id")

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

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

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

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

二:多对多关系数据操作

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

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

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

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

  示例

    def app(request):
app_list=Application.objects.all()
for app_tmp in app_list:
print(app_tmp.name,app_tmp.r.all())
return render(request,"app.html") --------------------------
CDA <QuerySet [<Host: Host object>, <Host: Host object>]>
DBA <QuerySet [<Host: Host object>]> def app(request):
app_list=Application.objects.all()
# for app_tmp in app_list:
# print(app_tmp.name,app_tmp.r.all())
return render(request,"app.html",{"app_list":app_list}) <table border="1px">
<thead>
<tr>
<td>应用名称</td>
<td>应用主机列表</td>
</tr>
</thead>
<tbody>
{% for app in app_list %}
<tr>
<td>{{ app.name }}</td>
<td>{% for r in app.r.all%} <~-- 循环访问第三张表里数据-->
<span>{{ r.hostname }}</span>
{% endfor %}
</td>
</tr>
{% endfor %}
</tbody>
</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. 二十九、Linux 进程与信号——minishell(2)

    编程内容: 1.完成  echo env export 命令 2.完成前后台进程 3.完成重定向 完整代码如下: 29.1 主函数.通用头文件和Makefile 29.1.1 主函数 mshell_m ...

  2. html5 area实例

    真实页面效果:就是一张图 html代码: <!DOCTYPE HTML> <html> <style> body{ padding:0px; margin:0px; ...

  3. MVC下 Area和Web同名的Controller问题

    错误如下图: 解决方案: 1:Area下的XXXAreaRegistration 添加:new string[] { "xxx.Areas.xxx.Controllers" } 2 ...

  4. vs 调式连接oracle报错问题32,64位问题

    wind8 系统选择项目时生成目标平台选择为X86 报错“System.Exception”类型的未经处理的异常在 WindowsFormsApplication1.exe 中发生 其他信息: 尝试加 ...

  5. postfix 指定用户限制指定域名收发

    main.cf 配置示例: smtpd_restriction_classes = local_in_only, local_out_only local_in_only = check_recipi ...

  6. 【转】AJAX 跨域请求 - JSONP获取JSON数据

    来源:http://justcoding.iteye.com/blog/1366102/ Asynchronous JavaScript and XML (Ajax ) 是驱动新一代 Web 站点(流 ...

  7. Python之进程 1 - 基本概念

    一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...

  8. luogu P4099 [HEOI2013]SAO

    传送门 吐槽题目标题 这个依赖关系是个树,可以考虑树型dp,设f_i表示子树i的答案 因为这是个序列问题,是要考虑某个数的位置的,所以设\(f_{i,j}\)表示子树i构成的序列,i在第j个位置的方案 ...

  9. Hive通过mysql元数据表删除分区

    1 创建表 hive命令行操作 CREATE TABLE IF NOT EXISTS emp( name STRING, salary FLOAT, subordinates ARRAY<STR ...

  10. windows server 2012 配置多用户ftp服务器配置注意点

    1.ftp根目录配置“FTP授权规则”为: 2.配置“FTP用户隔离”为: 3.配置“FTP目录浏览”为: 4.ftp虚拟目录“FTP授权规则”配置为: