一对多需要使用外键

一:外键创建ForeignKey

  b=models.ForeignKey(to="Business",to_field=("id"))#django会在生成表的时候变为b_id

  to表示和那个表关联,to_field没有和那个字段关联,不写默认是id

  

from django.db import models

# Create your models here.

class Foo(models.Model):
name=models.CharField(max_length=32) class Business(models.Model):
caption=models.CharField(max_length=32)
code=models.CharField(max_length=32,null=True,default="SA")
fk=models.ForeignKey(to="Foo",to_field=("id"))#默认会和主键关联 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"))

二:一对多数据创建

  一对多数据创建有两种方式

  1)使用对象创建

    

    Host.objects.create(
hostname="host1",
ip="1.1.1.1",
port="",
b=Business.objects.filter(id=1).first(),)

  2)直接使用外建字段_id创建

  

    Host.objects.create(
hostname="host1",
ip="1.1.1.1",
port="",
b_id=1,) #外键创建时候会自动把字段b建立成b_id字段,可以直接赋值。这种方法好于第一种,原因不需要连表查询,推荐第二种

三:一对多数据查询

  一对多数据查询有两种形式

  1)queryset内容为对象

    Host.objects.filter(nid__gt=0)
    Host.objects.all()等

  

    host_list=Host.objects.all()
for row in host_list:
print(row.b_id) #直接访问b_id
print(row.b) #这个是Business对象,所以访问下面的字段
print(row.b.caption)

     2)查询使用values和values_list指定字段,使用row.b.caption会直接报错。这里可以使用双下线跨表查询.

  3)查询使用values_list指定字段,使用row.b.caption会直接报错。这里可以使用双下线跨表查询.

    注:values返回是字典,values_list返回是元组

    示例如下: views

def host1(request):
v1=Host.objects.filter(nid__gt=0) #v1=Host.objects.filter(nid__gt=0)
# v1=Host.objects.filter(nid__gt=0).values("nid","hostname","b_id","b.caption") #b.caption不能跨表直接报错
v2=Host.objects.filter(nid__gt=0).values("nid","hostname","b_id","b__caption") #两个下划线可以实现跨表
#filter(nid__gt=0).values("nid","hostname","b_id","b__caption")相跨表都用双下划线
#queryset对象内部为字典
for row in v2:
print(row["nid"],row["hostname"],row["b_id"],row["b__caption"]) v3=Host.objects.filter(nid__gt=0).values_list("nid","hostname","b_id","b__caption")
return render(request,"host.html",{"v1":v1,"v2":v2,"v3":v3})

  模板代码:

  

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.shade {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: #333333;
opacity: 0.6;
z-index: 9;
} .add-mode {
position: fixed;
height: 300px;
width: 400px;
top: 100px;
left: 50%;
margin-left: -200px;
z-index: 11;
background-color: white;
} .hide {
display: none;
}
</style>
</head>
<body>
<input type="button" value="增加" id="add_host"> <h1>主机列表(对象)</h1>
<table border="1px">
<thead>
<tr>
<th>序号</th>
<th>主机名</th>
<th>主机地址</th>
<th>端口</th>
<th>业务线名称</th> </tr>
</thead>
<tbody>
{% for row in v1 %}
<tr host-id="{{ row.nid }}" bid="{{ row.b_id }}">
<td>{{ forloop.revcounter }}</td>
<td>{{ row.hostname }}</td>
<td>{{ row.ip }}</td>
<td>{{ row.port }}</td>
<td>{{ row.b.caption }}</td>
</tr>
{% endfor %} </tbody>
</table>
<h1>主机列表(字典)</h1>
<table border="1px">
<thead>
<tr>
<th>主机名</th>
<th>主机地址</th>
<th>端口</th>
<th>业务线名称</th>
</tr>
</thead>
<tbody>
{% for row in v2 %}
<tr host-id="{{ row.nid }}" bid="{{ row.b_id }}">
<td>{{ row.hostname }}</td>
<td>{{ row.ip }}</td>
<td>{{ row.port }}</td>
<td>{{ row.b__caption }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<h1>主机列表(元组)</h1>
<table border="1px">
<thead>
<tr>
<th>主机名</th>
<th>主机地址</th>
<th>端口</th>
<th>业务线名称</th>
</tr>
</thead>
<tbody>
{% for row in v3 %}
<tr host-id="{{ row.nid }}" bid="{{ row.b_id }}">
<td>{{ row.0 }}</td>
<td>{{ row.1 }}</td>
<td>{{ row.2 }}</td>
<td>{{ row.3 }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<table border="1px">
<thead>
<tr>
<th>序号</th>
<th>主机名</th>
<th>主机地址</th>
<th>端口</th>
<th>业务线名称</th> </tr>
</thead>
<tbody>
{% for i in v1 %}
{% for row in v1 %}
<tr host-id="{{ row.nid }}" bid="{{ row.b_id }}">
<td>{{ forloop.parentloop }}</td>
<td>{{ row.hostname }}</td>
<td>{{ row.ip }}</td>
<td>{{ row.port }}</td>
<td>{{ row.b.caption }}</td>
</tr>
{% endfor %}
{% endfor %} </tbody>
</table>
<!--模态对话框实现增加主机信息-->
<div class="shade hide"></div>
<div class="add-mode hide">
<form action="/host" method="post">
<div class="group">
<input type="text" name="hostname" placeholder="请输入主机名">
</div>
<div class="group">
<input type="text" name="ip" placeholder="请输入主机IP">
</div>
<div class="group">
<input type="text" name="port" placeholder="请输入主机端口">
</div>
    <!--绑定businss信息-->
<div class="group">
<select name="group_id">
{% for group in v4 %}
<option value="{{ group.id }}">{{ group.caption }}</option>
{% endfor %}
</select>
</div>
<div class="group">
<input type="submit" value="提交">
<input type="button" value="取消">
</div>
</form>
</div> <script src="/static/jquery-1.12.4.js"></script>
<script>
$("#add_host").click(
function () {
$(".shade,.add-mode").removeClass("hide")
}
)
</script>
</body>
</html>

13)django-ORM(连表一对多,外键创建,创建数据,3种查询)的更多相关文章

  1. 测试脚本配置、ORM必知必会13条、双下划线查询、一对多外键关系、多对多外键关系、多表查询

    测试脚本配置 ''' 当你只是想测试django中的某一个文件内容 那么你可以不用书写前后端交互的形式而是直接写一个测试脚本即可 脚本代码无论是写在应用下的test.py还是单独开设py文件都可以 ' ...

  2. Django图书管理系统(前端对有外键的数据表增删改查)

    图书管理 书籍管理 book name 项目源码位置:https://gitee.com/machangwei-8/learning_materials/tree/master/%E9%A1%B9%E ...

  3. Django ORM 多表操作

    目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加外键) 一对多(外键 ForeignKey) 一对一 (OneToOneFeild) 多对 ...

  4. Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询

    Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...

  5. Django QuerySet 方法梳理 。model外键 多对多的保存

    引用:https://feifeiyum.github.io/2017/03/28/python-django-queryset/ 说明 Models 层是 Django 框架中最强大的部分之一, 大 ...

  6. 在PowerDesigner中设计物理模型1——表和主外键

    原文:在PowerDesigner中设计物理模型1--表和主外键 在PD中建立物理模型由以下几种办法: 直接新建物理模型. 设计好概念模型,然后由概念模型生成物理模型. 设计好逻辑模型,然后由逻辑模型 ...

  7. 在PowerDesigner中设计物理模型1——表和主外键(转)

    出处:http://www.cnblogs.com/studyzy/archive/2009/12/15/1624899.html 在PD中建立物理模型由以下几种办法: 直接新建物理模型. 设计好概念 ...

  8. Django学习笔记6(iframe、外键插入)

    1.{%include 'index.html'%i} 平时很好用的iframe在django里面的不是很好用 django里面提供了{%include 'index.html'%i}的方式来取代了i ...

  9. mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)

    字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...

  10. SQL SERVER中获取表间主外键关系

    sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OB ...

随机推荐

  1. Vue.js入门系列教程(三)

    序言

  2. JS判断是电脑浏览器还是手机端浏览器,并根据不同的终端跳转到不同的网址

    <!DOCTYPE html> <html> <script> function browserRedirect() { var sUserAgent = navi ...

  3. IT这条路,适合什么人走。

    今天 ,到图书馆Study,呼,不知道为撒,看到那么多新书,那么多新技术(也不能说是新技术,就是自己没有学习过的技术),特别兴奋,学习的疲劳顿时间就没了,感觉什么都想学,都想据为己有,但是...... ...

  4. 判断质数(Java)

    package day01; //输出1-100中质数,并且每十个换行 public class PrimeNum { public static void main(String[] args) { ...

  5. 浅谈style.,currentStyle,getComputedStyle,getAttribute

    xxx为属性. ele为元素. 1.style.是针对于样式 在前面的一篇博客中我也有说到,ele.style.xxx; 通常用于赋值,赋值也是针对于行内样式,用它来取值的话,它只能取到内联样式. 今 ...

  6. 【bzoj 3524】[Poi2014]Couriers

    Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. ...

  7. oracle 窗口函数over

    select *,sum(字段) over()from table :--相加所有行这个字段的和 select max(字段1),over(partition by  字段2,字段3) from ta ...

  8. php函数:解决数组转对象时数组内中文乱码问题

    function to_urlencode(&$arr){//解决数组转对象时数组内中文乱码问题 foreach($arr as $key => $value){ if(is_array ...

  9. blender 操作快捷键

    选择:a: 全选OR取消选择b: 矩形选择c: 画刷选择ctrl+左键:套索选择ctrl+alt+右键 : 环边选择ctrl+右键:ctrl+tab:切换 点,线,面 选择模式ctrl+- 选择/收缩 ...

  10. Linux查看系统的基本信息

    uname -r :显示操作系统的发行版号 uname -a:显示系统名.节点名称.操作系统的发行版号.操作系统版本.运行系统的机器 ID 号. # Ubuntu系统 ubuntu@VM-28-69- ...