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列表中的所有值

    

时间: 2024-10-14 10:29:56

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

Python学习之旅—Django基础

前言  前段时间业务比较繁忙,没时间更新博客,从这周开始将继续为各位更新博客.本次分享的主题是Django的基础部分,涵盖Django MTV三部分,并通过一个简单的班级管理系统来说明如何使用Django进行开发,好啦,开始今天的主题吧! 一.浅谈MVC.MTV和MVVM 要学习Django,我们很有必要了解下MVC,MTV和MVVM三种模式. [001]MVC MVC(Model View Controller 模型-视图-控制器)是一种Web架构的模式(本文不讨论桌面应用的MVC),它把业务

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

上一节说道如何使用Django创建并运行一个项目,这节说如何添加一个博客应用. 一 项目跟应用的关系 在添加应用之前,先来看看项目与应用之间有什么不同之处呢? 项目是针对一个特定的 Web 网站相关的配置和其应用的组合.一个项目可以包含多个应用. 应用是一个提供功能的 Web 应用 – 例如:一个博客系统.一个公共记录的数据库或者一个简单的投票系统. 应用是"可插拔的":你可以在多个项目使用一个应用,你还可以分发应用,因为它们没有被捆绑到一个给定的 Django 安装环境中. 这样,我

python学习笔记-Day18 -django(第一部分)

路由系统 第一种  一般设置方式 from django.conf.urls import include, url from django.contrib import admin from indexPage import views urlpatterns = [     url(r'^$', views.indexPage),     url(r'^reg/$', views.reg),     url(r'^home/$', views.home), ] 第二种 动态URL url(r

Python学习笔记23:Django搭建简单的博客网站(一)

上一节说了如何下载安装Django,这一节主要将如何使用Django创建运行一个网站. 一 新建工程 命令:django-admin startproject mysite # 有的需要输入:django-admin.py startproject mysite 这是你会发现在当前目录下,生成了一个文件夹mysite,其结构为: mysite/ manage.py mysite/ __init.py settings.py urls.py wsgi.py 其中: manage.py:一个命令行工

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

Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C. 它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件. 并于2005年7月在BSD许可证下发布.这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. --百度百科 官网下载:https://www.djangoproject.com/download/ 官网中也给出了一些命令行安装方法,下面要说得是

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

Django它是一个开源Web应用程序框架.由Python书面. 通过MVC软件设计模式,这种模式M,视图V和控制器C. 它最初是一个数字新闻内容为主的网站已经发展到管理劳伦斯出版集团.那是,CMS(内容管理系统)软件. 于2005年7月在BSD许可证下公布.这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. --百度百科 官网下载:https://www.djangoproject.com/download/ 官网中也给出了一些命令行安装方法,以下要说得是下载的压缩

python学习第二十天

Ajax标准结构 $('ajax_submit').click(function(){ $ajax({ url:"/text_ajax",提交连接 type:"POST",  提交方式 #data:{'hostname':$('#host').val(),'ip':$('#ip').val(),'port':$('#port').val(),'b_id':$('#sel').val()},  提交数据 data:$(#form标签的ID).serialize(),

Python 学习笔记 - 作用域小知识

Python的作用域和其他语言有所不同,他有几个小窍门来判断作用域. 1. Python里面没有块级别的作用域:只有函数级别的作用域. 比如说,下面这个例子,如果是Java或者其他语言,肯定报错name没有定义.Python里面因为不存在块级别的作用域,因此name直接就输出9了 >>> for i in range(10):     name=i print(name) ---------- 9 2. 作用域链的顺序是从内往外找,直到找不到为止 例如 >>> def 

(一)Python 学习第一天--基础知识,列表

1. .pyc文件 .pyc文件:在python3中,当模块运行时会自动生成在_pycache_文件夹中,其中c为compiled的缩写. Python是一门现编译后解释的语言,在运行时首先寻找.pyc文件,若没有先到内存先编译再解释,生成.pyc文件.如果源文件发生改动,则先对比对应的.pyc文件与源文件的时间戳. 2.数据类型 在Python2中当值大于2^64位时,为long型:Python3不存在long型,所有都为int型. 3.三元运算符 result = 值1  if   条件