Python 学习第二十天 django知识
一,django models
1,django ORM获取后台数据的方式,总共有三种
(1)v1 = models.Business.objects.all()
返回值为QuerySet类型,内部元素都是对象
[obj(id,caption,code),obj(id,caption,code),obj(id,caption,code)]
(2)v2 = models.Business.objects.all.values('id','caption')
返回值为QuerySet类型,内部元素都是字典
[{'id':1,'caption':'运维部'},{'id':2,'caption':'市场部'},...]
(3)v3 = models.Business.objects.all.values_list('id','caption')
返回值为QuerySet类型,内部元素都是元组
{(1,运维部),(2,开发)}
2,models.Business.objects.get(id=1) 获取的值为一个对象,如果不存在就直接报错
3,models.Business.objects.filter(id=1).first() 获取的值为一个对象,不存在返回none
4,主机管理项目代码,views.py取值为对象形式
(1) models 代码
from django.db import models # Create your models here.
# class Foo(models.Model):
# name = models.CharField(max_length=1) class Business(models.Model):
# id
caption = models.CharField(max_length=32)
code = models.CharField(max_length=32,null=True,default="SA")
# fk = models.ForeignKey('Foo') 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') #b 为一个对象,封装了Business表里面的一行数据 (2) views.py代码
def host(request):
v1 = models.Host.objects.filter(nid__gt=0) #相当于models.Host.objects.all()
for row in v1:
print(row.nid,row.hostname,row.ip,row.port,row.b_id,row.b.caption,row.b.code,row.b.id,sep='\t')
return HttpResponse(request,'host.html',{'v1':v1})
(3)templates host.html
<table border="1">
<thead>
<tr>
<th>序号</th>
<th>主机名</th>
<th>IP</th>
<th>端口</th>
<th>业务线名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for row in v1 %}
<tr hid="{{ row.nid }}" bid="{{ row.b_id }}"> #隐藏掉Host的nid列和Business的id列
<td>{{ forloop.counter }}</td>
<td>{{ row.hostname }}</td>
<td>{{ row.ip }}</td>
<td>{{ row.port }}</td>
<td>{{ row.b.caption }}</td>
<td>
<a class="edit">编辑</a>|<a class="delete">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
5,主机管理,views.py取值为字典形式
(1)views.py代码
def host(request):
v2 = models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption') #b跨表查询为__双下划下
# QuerySet: [ {} ]
# print(v2)
# for row in v2:
# print(row['nid'],row['hostname'],row['b_id'],row['b__caption'])
return render(request,'host.html',{'v2':v2})
(2)templates html 代码
<h1>主机列表(字典)</h1>
<table border="1">
<thead>
<tr>
<th>主机名</th>
<th>业务线名称</th>
</tr>
</thead>
<tbody>
{% for row in v2 %}
<tr hid="{{ row.nid }}" bid="{{ row.b_id }}">
<td>{{ row.hostname }}</td>
<td>{{ row.b__caption }}</td>
</tr>
{% endfor %} </tbody>
</table>
6,主机管理,views.py取值为元组形式
(1)views.py 代码
def host(request):
v3 = models.Host.objects.filter(nid__gt=0).values_list('nid','hostname','b_id','b__caption')
# QuerySet: [()]
# print(v2)
return render(request, 'host.html', {'v3': v3})
(2)templates html代码
<h1>主机列表(元组)</h1>
<table border="1">
<thead>
<tr>
<th>主机名</th>
<th>业务线名称</th>
</tr>
</thead>
<tbody>
{% for row in v3 %}
<tr hid="{{ row.0 }}" bid="{{ row.2 }}">
<td>{{ row.1 }}</td>
<td>{{ row.3 }}</td>
</tr>
{% endfor %} </tbody>
</table>
7,templates 中的for 循环的特殊值
(1)forloop.counter 循环计数器(从1开始计数,可以用作序号列)
(2)forloop.counter0 循环计数器(从0开始计数)
(3)forloop.revcounter 循环计数器(倒序从从1开始计数)
(4)forloop.revcounter0 循环计数器(倒序从0开始计数)
(5)forloop.last 是否是最后一个 forloop.first是否是第一个
8, ajax 内容
(1)ajax 前端代码示例
$.ajax({
url: '/host', #提交的url
type: "POST", #提交的方式
data: {'k1': 123,'k2': "root"}, #提交的数据
success: function(data){ #后台返回数据后,触发的函数
// data是服务器端返回的字符串
var obj = JSON.parse(data);
}
})
(2)ajax views.py返回的时候需要用HttpResponse("字符串")
如果view.py获取的值为字典,则需要用json.dumps("字典"),然后返回 return HttpResponse(json.dumps("字典")
前端接收字符串之后进行反序列化转化成对象 在Javascript 中用var obj=JSON.parse(data)
前端将对象转化成字符串,在Javascript中用JSON.stringify(),例如 list=[1,2,3,4],将列表转化为字符串J SON.stringify(list)
(3)ajax 后台返回可用HttpResponse() 和render(只含有字符串)
(4)ajax 获取form 中的所有值data:$('#add_form').serialize()
9,models 多对多自定义关系表定义方式
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') #Host表中的一行对象
aobj = models.ForeignKey(to='Application',to_field='id') #Application表中的一行对象
10,models 自动创建多对多关系表
(1)models.py代码示例
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") #默认最多只能创建两列的关联关系
(2)数据操作
1, obj =Application.objects.get(id=1)
obj 对象包含两个内容,obj.name,obj.r,
如果要增加值obj.r.add(1) 表示在第三张表中增加一个1,对应1,即host id为1,application id为1
obj.r.add(2) 表示在第三张表中增加一个1,对应2,即host id 为2,application id 为1
另外增加可以传一个列表[1,2,3,4] obj.r.add(*[1,2,3,4])增加一个application id 为1,host id 为1,2,3,4 即1-1,1-2,1-3,1-4
2, obj.r.remove(1),删除掉1-1
obj.r.remove(*[1,2,3]),删除1-1,1-2,1-3
obj.r.remove(2,4),删除1-2,1-4
3,obj.r.clear() 清除application为1的所有关联数据
4,obj.r.set([3,5,7])表示设置application为1,所有关联只有3,5,7,即只有1-3,1-5,1-7
5,obj.r.all()获取所有application id 为1 的关联的主机对象“列表”
11,ajax 内容补充
(1)
$.ajax({
url: '/host', #提交的url
type: "POST", #提交的方式
data: {'k1': 123,'k2': "root"}, #提交的数据
dataType:'JSON', #将后台返回的数据转化为json对象,不再需要JSON.parse转化
success: function(obj){ #后台返回obj对象,触发的函数
// data是服务器端返回的字符串
}
})
(2)发给后端的数据包含列表
$.ajax({
url: '/host', #提交的url
type: "POST", #提交的方式
data: {'k1': 123,'host_list': [1,2,3]}, #提交的数据
dataType:'JSON', #将后台返回的数据转化为json对象,不再需要JSON.parse转化
traditional:true, #将host_list列表转为字符串
success: function(obj){ #后台返回obj对象,触发的函数
// data是服务器端返回的字符串
}
}) #views.py获取
request.POST.getlist('host_list') #可以获取host_list列表中的所有值
Python 学习第二十天 django知识的更多相关文章
- Python学习笔记_04:Django框架简介
目录 1 什么是Django? 2 Django框架的开发环境搭建 3 Django操作MySql数据库简介 4 功能强大的Django管理工具应用 1 什么是Django? Django是应用于We ...
- Python学习笔记(Django篇)——3、创建第一个数据库模型
Django里面集成了SQLite的数据库,对于初期研究来说,可以用这个学习. 第一步,创建数据库就涉及到建表等一系列的工作,在此之前,要先在cmd执行一个命令: python manage.py ...
- python 学习笔记十七 django深入学习二 form,models
表单 GET 和 POST 处理表单时候只会用到GET 和 POST 方法. Django 的登录表单使用POST 方法,在这个方法中浏览器组合表单数据.对它们进行编码以用于传输.将它们发送到服务器然 ...
- Python学习笔记22:Django下载并安装
Django它是一个开源Web应用程序框架.由Python书面. 通过MVC软件设计模式,这种模式M,视图V和控制器C. 它最初是一个数字新闻内容为主的网站已经发展到管理劳伦斯出版集团.那是,CMS( ...
- Python学习笔记23:Django构建一个简单的博客网站(一个)
在说如何下载和安装Django,本节将重点讨论如何使用Django站点. 一 新建project 命令:django-admin startproject mysite # 有的须要输入:django ...
- Python学习第二节——基础知识
# !/usr/bin/edv python 脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它.# -*- coding:UTF-8 -*- 标明编码注释 ...
- Python学习笔记(Django篇)——2、创建第一个django应用
在helloworld工程的基础上,我们准备创建第一个基于web的django应用,把这个应用名字命名为demo 首先,是如何创建这个应用包,当然第一选择我们可以进入到cmd中,执行如下命令 py ...
- Python学习笔记(Django篇)——1、环境搭建篇(如何在Pycharm中配置Python和Django)
1.准备好以下东东,并且按照先后顺序进行安装: Python 3.6 (64-bit) Django-1.11.tar.gz pycharm-community-2016.3.2.exe 安装好了 ...
- Python学习笔记24:Django搭建简单的博客站点(二)
上一节说道怎样使用Django创建并执行一个项目.这节说怎样加入一个博客应用. 一 项目跟应用的关系 在加入应用之前,先来看看项目与应用之间有什么不同之处呢? 项目是针对一个特定的 Web 站点相关的 ...
随机推荐
- Linux 下 查看以及修改文件权限
查看权限 在终端输入: ls -l xxx.xxx (xxx.xxx是文件名) 那么就会出现相类似的信息,主要都是这些: -rw-rw-r-- 其中: 最前面那个 - 代表的是类型 中间那三个 rw- ...
- phpstorm 使用技巧
专题1 专题2 专题3 专题4 快捷键
- mysql 快速简单安装法
网上下载的编译好的包 最好安装在 /usr/local 目录下面: 我用的mysql的版本的是:mysql--linux-i686-icc-glibc23.tar.gz 在官网上就可以下载到. 先期工 ...
- Android 只开启一个Activity实例
在一个Activity中,多次调用startActivity()来启动另一个Activity,要想只生成一个Activity实例,方法有两种. 方法一:设置起动模式 一个Activity有四种启动模式 ...
- html 杂记
<link rel="******" href=“****.css” type=“text/css” media=“screen” />css样式外部链接 加个斜杠 ...
- 《jQuery判断radio、checkbox、select 是否选中和设置选中问题以及获取选中值》总结
<form> <input type="radio" name="gender" id="man" value=" ...
- VS2010+Qt5.4.0 环境搭建(离线安装)
原创作者:http://blog.csdn.net/solomon1558/article/details/44084969 前言 因项目需要Qt开发GUI,我根据网上资料及自己的经验整理了搭建vs2 ...
- setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式
<script type="text/javascript"> setInterval(function(){ var myDate = new Date(); var ...
- pycharm快捷键及一些常用设置
pycharm快捷键及一些常用设置,有需要的朋友可以参考下. Alt+Enter 自动添加包 Ctrl+t SVN更新 Ctrl+k SVN提交 Ctrl + / 注释(取消注释)选择的行 Ctrl+ ...
- Sicily 1051: 魔板(BFS+排重)
相对1150题来说,这道题的N可能超过10,所以需要进行排重,即相同状态的魔板不要重复压倒队列里,这里我用map储存操作过的状态,也可以用康托编码来储存状态,这样时间缩短为0.03秒.关于康托展开可以 ...