一,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. (1) models 代码
  2. from django.db import models
  3.  
  4. # Create your models here.
  5. # class Foo(models.Model):
  6. # name = models.CharField(max_length=1)
  7.  
  8. class Business(models.Model):
  9. # id
  10. caption = models.CharField(max_length=32)
  11. code = models.CharField(max_length=32,null=True,default="SA")
  12. # fk = models.ForeignKey('Foo')
  13.  
  14. class Host(models.Model):
  15. nid = models.AutoField(primary_key=True)
  16. hostname = models.CharField(max_length=32,db_index=True)
  17. ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
  18. port = models.IntegerField()
  19. b = models.ForeignKey(to="Business", to_field='id') #b 为一个对象,封装了Business表里面的一行数据
  20.  
  21. (2) views.py代码
  22. def host(request):
  23. v1 = models.Host.objects.filter(nid__gt=0) #相当于models.Host.objects.all()
  24. for row in v1:
  25. print(row.nid,row.hostname,row.ip,row.port,row.b_id,row.b.caption,row.b.code,row.b.id,sep='\t')
  26. return HttpResponse(request,'host.html',{'v1':v1})
  27. (3)templates host.html
  28. <table border="1">
  29. <thead>
  30. <tr>
  31. <th>序号</th>
  32. <th>主机名</th>
  33. <th>IP</th>
  34. <th>端口</th>
  35. <th>业务线名称</th>
  36. <th>操作</th>
  37. </tr>
  38. </thead>
  39. <tbody>
  40. {% for row in v1 %}
  41. <tr hid="{{ row.nid }}" bid="{{ row.b_id }}"> #隐藏掉Host的nid列和Business的id列
  42. <td>{{ forloop.counter }}</td>
  43. <td>{{ row.hostname }}</td>
  44. <td>{{ row.ip }}</td>
  45. <td>{{ row.port }}</td>
  46. <td>{{ row.b.caption }}</td>
  47. <td>
  48. <a class="edit">编辑</a>|<a class="delete">删除</a>
  49. </td>
  50. </tr>
  51. {% endfor %}
  52. </tbody>
  53. </table>

5,主机管理,views.py取值为字典形式

  1. 1views.py代码
  2. def host(request):
  3. v2 = models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption') #b跨表查询为__双下划下
  4. # QuerySet: [ {} ]
  5. # print(v2)
  6. # for row in v2:
  7. # print(row['nid'],row['hostname'],row['b_id'],row['b__caption'])
  8. return render(request,'host.html',{'v2':v2})
  9. 2templates html 代码
  10. <h1>主机列表(字典)</h1>
  11. <table border="1">
  12. <thead>
  13. <tr>
  14. <th>主机名</th>
  15. <th>业务线名称</th>
  16. </tr>
  17. </thead>
  18. <tbody>
  19. {% for row in v2 %}
  20. <tr hid="{{ row.nid }}" bid="{{ row.b_id }}">
  21. <td>{{ row.hostname }}</td>
  22. <td>{{ row.b__caption }}</td>
  23. </tr>
  24. {% endfor %}
  25.  
  26. </tbody>
  27. </table>

6,主机管理,views.py取值为元组形式

  1. 1views.py 代码
  2. def host(request):
  3. v3 = models.Host.objects.filter(nid__gt=0).values_list('nid','hostname','b_id','b__caption')
  4. # QuerySet: [()]
  5. # print(v2)
  6. return render(request, 'host.html', {'v3': v3})
  7. 2templates html代码
  8. <h1>主机列表(元组)</h1>
  9. <table border="1">
  10. <thead>
  11. <tr>
  12. <th>主机名</th>
  13. <th>业务线名称</th>
  14. </tr>
  15. </thead>
  16. <tbody>
  17. {% for row in v3 %}
  18. <tr hid="{{ row.0 }}" bid="{{ row.2 }}">
  19. <td>{{ row.1 }}</td>
  20. <td>{{ row.3 }}</td>
  21. </tr>
  22. {% endfor %}
  23.  
  24. </tbody>
  25. </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 前端代码示例

  1. $.ajax({
  2. url: '/host', #提交的url
  3. type: "POST", #提交的方式
  4. data: {'k1': 123,'k2': "root"}, #提交的数据
  5. success: function(data){ #后台返回数据后,触发的函数
  6. // data是服务器端返回的字符串
  7. var obj = JSON.parse(data);
  8. }
  9. })

(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 多对多自定义关系表定义方式 

  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. class Application(models.Model):
  8. name = models.CharField(max_length=32)
  9. class HostToApp(models.Model):
  10. hobj = models.ForeignKey(to='Host',to_field='nid') #Host表中的一行对象
  11. aobj = models.ForeignKey(to='Application',to_field='id') #Application表中的一行对象

10,models 自动创建多对多关系表

(1)models.py代码示例

  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") #默认最多只能创建两列的关联关系

(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)

  1. $.ajax({
  2. url: '/host', #提交的url
  3. type: "POST", #提交的方式
  4. data: {'k1': 123,'k2': "root"}, #提交的数据
  5. dataType:'JSON', #将后台返回的数据转化为json对象,不再需要JSON.parse转化
  6. success: function(obj){ #后台返回obj对象,触发的函数
  7. // data是服务器端返回的字符串
  8. }
  9. })

(2)发给后端的数据包含列表

  1. $.ajax({
  2. url: '/host', #提交的url
  3. type: "POST", #提交的方式
  4. data: {'k1': 123,'host_list': [1,2,3]}, #提交的数据
  5. dataType:'JSON', #将后台返回的数据转化为json对象,不再需要JSON.parse转化
  6. traditional:true, #将host_list列表转为字符串
  7. success: function(obj){ #后台返回obj对象,触发的函数
  8. // data是服务器端返回的字符串
  9. }
  10. })
  11.  
  12. #views.py获取
  13. request.POST.getlist('host_list') #可以获取host_list列表中的所有值

    

Python 学习第二十天 django知识的更多相关文章

  1. Python学习笔记_04:Django框架简介

    目录 1 什么是Django? 2 Django框架的开发环境搭建 3 Django操作MySql数据库简介 4 功能强大的Django管理工具应用 1 什么是Django? Django是应用于We ...

  2. Python学习笔记(Django篇)——3、创建第一个数据库模型

    Django里面集成了SQLite的数据库,对于初期研究来说,可以用这个学习.   第一步,创建数据库就涉及到建表等一系列的工作,在此之前,要先在cmd执行一个命令: python manage.py ...

  3. python 学习笔记十七 django深入学习二 form,models

    表单 GET 和 POST 处理表单时候只会用到GET 和 POST 方法. Django 的登录表单使用POST 方法,在这个方法中浏览器组合表单数据.对它们进行编码以用于传输.将它们发送到服务器然 ...

  4. Python学习笔记22:Django下载并安装

    Django它是一个开源Web应用程序框架.由Python书面. 通过MVC软件设计模式,这种模式M,视图V和控制器C. 它最初是一个数字新闻内容为主的网站已经发展到管理劳伦斯出版集团.那是,CMS( ...

  5. Python学习笔记23:Django构建一个简单的博客网站(一个)

    在说如何下载和安装Django,本节将重点讨论如何使用Django站点. 一 新建project 命令:django-admin startproject mysite # 有的须要输入:django ...

  6. Python学习第二节——基础知识

    # !/usr/bin/edv python    脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它.# -*- coding:UTF-8 -*-    标明编码注释 ...

  7. Python学习笔记(Django篇)——2、创建第一个django应用

    在helloworld工程的基础上,我们准备创建第一个基于web的django应用,把这个应用名字命名为demo   首先,是如何创建这个应用包,当然第一选择我们可以进入到cmd中,执行如下命令 py ...

  8. Python学习笔记(Django篇)——1、环境搭建篇(如何在Pycharm中配置Python和Django)

      1.准备好以下东东,并且按照先后顺序进行安装: Python 3.6 (64-bit) Django-1.11.tar.gz pycharm-community-2016.3.2.exe 安装好了 ...

  9. Python学习笔记24:Django搭建简单的博客站点(二)

    上一节说道怎样使用Django创建并执行一个项目.这节说怎样加入一个博客应用. 一 项目跟应用的关系 在加入应用之前,先来看看项目与应用之间有什么不同之处呢? 项目是针对一个特定的 Web 站点相关的 ...

随机推荐

  1. 常用function() 收集

    1.随机数生成函数(来源-微信支付demo案例) /** * * 产生随机字符串,不长于32位 * @param int $length * @return 产生的随机字符串 */ public st ...

  2. 2016百度之星 初赛2A ABEF

    只做了1001 1002 1005 1006.剩下2题可能以后补? http://acm.hdu.edu.cn/search.php?field=problem&key=2016%22%B0% ...

  3. 布局TextView和EditText区别,layout_width和lay_weight区别--Android Studio

    1. TextView控件是文本表示控件,主要功能是向用户展示文本的内容,它是不可编辑的,如设置标题:EditText控件是编辑文本控件,主要功能是让用户输入文本的内容,它是可以编辑的.每一个控件都有 ...

  4. jcFeather Maya 羽毛插件

    jcFeather 2.8.6 插件持续更新地址为:http://www.jerrykon.com/jcFeather.html 和 http://www.creativecrash.com/maya ...

  5. Stm32F107VCT6硬件资源

    一直在用stm32系列的单片机,最近因为需要使用到以太网,所以采用了stm32f107vc这款芯片.对于存储资源一直不是非常清楚,今天专门到官网看了一下. 如下: RAM------>64kB ...

  6. C语言(Linux)中常用到的函数

    在接触Linux C之前,我比较少用到的函数,都会记录在这里.(持续更新中……) 在学习malloc()函数原理性实现时, size_t:是一种数据类型,标准C库中定义的一种类型,近似于unsigne ...

  7. [原创]zepto打造一款移动端划屏插件

    最近忙着将项目内的jquery 2换成zepto 因为不想引用过多的zepto包,所以花了点时间 zepto真的精简了许多,源代码看着真舒服 正好项目内需要一个划屏插件,就用zepto写了一个 逻辑其 ...

  8. Sql Server函数全解<一>字符串函数

    阅读目录 1.ASCII()函数 2.CHAR()函数 3.LEFT()函数 4.RIGHT()函数 5.LTRIM()函数 6.RTRIM()函数 7.STR()函数 8.字符串逆序的函数REVER ...

  9. JSON Accelerator真是个好东西...

    支持OBJC,JAVA,Python,OBJC(Core Data),Python(Django) 并实现了NSCoding和NSCoping,方便归档和复制. 再也不用辛辛苦苦的写Model了.. ...

  10. Linux远程执行Shell命令或脚本

    ## 远程执行shell命令 ssh [user]@[server] '[command]' # eg. ssh root@192.168.1.1 'uptime' ## 远程执行本地shell脚本 ...