• 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='	')
        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列表中的所有值
    

        

  • 相关阅读:
    windows开启PostgreSQL数据库远程访问
    Git使用介绍
    linux 常用工具记录及简介
    ubuntu18 安装坑点记录(华硕飞行堡垒)
    快手自动视频随机点赞脚本
    接触手机脚本编程------基于触动精灵的lua编程
    使电脑蜂鸣器发声小脚本
    tensorflow--非线性回归
    python笔记--------numpy
    python笔记--------二
  • 原文地址:https://www.cnblogs.com/system-public/p/6204583.html
Copyright © 2020-2023  润新知