zoukankan      html  css  js  c++  java
  • Python学习笔记第二十周

    目录:

      一、ORM

         1、查询补充

          备注:forloop.counter介绍

        二、Ajax

       三、ORM多对多操作

    内容:

      一、ORM

      1、查询补充:

      1、models.USR.objects.all().values('id','name')

      这个语句相当于SQL语句中的select id,name from USER  ,表示可以单独取某几列的值,取得的值仍然是QuerySet,但是内部元素变为字典

      2、models.USR.objects.all().value_list('id','name')

      表示可以单独取某几列的值,取得的值仍然是QuerySet,但是内部元素变为元组

      3、models.USR.objects.filter(id=1).first()

      表示获取单个对象,如果获取不到返回None

      4、models.USR.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')

      在这里有两点需要注意:

        1、nid后面是__gt 有两个下划线,同样小于  、大于等于 小于等于(__lt    __gte    __lte)这几个都是双下划线

        2、在values里面需要跨表取值的时候,同样需要双下划线,比如b__caption, 但是b_id是单下划线,因为它只是在User表中没有跨表取值,在这里普通跨表取值的"."是不生效的,必须使用"__"  

      备注:

      模板语言中如果想要序号,可以通过在循环中增加forloop的方式进行,例如:

      {% for row in iem %}

        {{ forloop.counter}}  

      {%endfor %}

      在每个循环中都有forloop,forloop.counter就是一个计数器,每循环一次就记一下,除了counter以外,还有counter0,表示从0开始,revcounter表示倒序,revcounter0表示从0开始倒序,last是否是最后一个循环,first是否是第一个循环,除此之外还有forloop.parentloop,表示在嵌套循环中,每个循环都包括以上6个属性(counter/counter0/revcounter/revcounter0/first/last)

      Tips:

      在PyCharm中,如果需要改整个project的字体格式,需要去设置中查找 Editor-> File Encodings 设置Project Encoding:utf-8

       JS重新加载页面:location.reload()

      二、Ajax

       在jQuery中实现Ajax悄悄传值而不刷新页面

      $('#ajax_submit').click(function(){

        $.ajax({

          url: "/test_ajax",

          type: 'POST',

          data: {'hostname': $('#host').val(),'ip': $('#ip).val(), 'port': $('#port').val(), 'b_id': $('#sel').val()},

          success: function(data){

            if(data == "OK"){

              location.reload()    //这个表示刷新页面

            }else {

              alert(data);

                }

              }

            })

          })

      Ajax数据请求返回的方式使用的是HttpResponse,而且如果返回的是一个字典需要用json格式化,json.dumps()

      等前端Ajax收到该请求后,需要将字符串转换成对象,在前端使用var obj = JSON.parse(data),同时如果在前端如果想把对象转换成字符串需要使用:

      JSON.stringify(对象名)

      Ajax对应form表达里的值发送到后端有个简单方法:

      $.Ajax({

        data: $('form的ID或Class').serialize();

    })

      如果不想每次收到后端字符串都做json处理,可以按照如下操作:

      

    $('#ajax_submit').click(function(){

        $.ajax({

          url: "/test_ajax",

          type: 'POST',

          data: {‘user’: 123, 'host_list':[12,3,4,5]},   

          dataType: 'JSON',

          traditional: true;  /*默认情况下jQuery只能处理字符串然后发送到后台,如果像这个data里发送的列表,就没法处理会发送None,需要添加tranditional字段才可以处理*/  而且注意后端要修改为request.POST.getlist()方法

          success: function(obj){  /* 在这里obj是已经字符串转换成对象后的数据*/

            if(obj == "OK"){

              location.reload()    //这个表示刷新页面

            }else {

              alert(obj);

                }

            error:function(){

              /*该错误是发到后端,后端异常的错误,而是发送了个请求,后端没有捕捉到的为止错误*/

              }

            })

          })

          jQuery中,如果一个列表要插入数据:

           hid_list = []

           hid_list.push(hid)

      三、ORM多对多操作    

        多对多:
          创建多对多:
            方式一:自定义关系表
              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')
                # 10
              class Application(models.Model):
                name = models.CharField(max_length=32)
                # 2

              class HostToApp(models.Model):
                hobj = models.ForeignKey(to='Host',to_field='nid')
                aobj = models.ForeignKey(to='Application',to_field='id')

              # HostToApp.objects.create(hobj_id=1,aobj_id=2)

          方式二:自动创建关系表
              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')
                # 10
              class Application(models.Model):
                name = models.CharField(max_length=32)
                r = models.ManyToManyField("Host")

              无法直接对第三张表进行操作

              obj = Application.objects.get(id=1)
              obj.name

              # 第三张表操作
              obj.r.add(1)
              obj.r.add(2)
              obj.r.add(2,3,4)
              obj.r.add(*[1,2,3,4])

              obj.r.remove(1)
              obj.r.remove(2,4)
              obj.r.remove(*[1,2,3])

              obj.r.clear()

              obj.r.set([3,5,7])

              # 所有相关的主机对象“列表” QuerySet
              obj.r.all()

  • 相关阅读:
    November 13th 2016 Week 47th Sunday The 1st Day
    November 12th 2016 Week 46th Saturday
    November 11th 2016 Week 46th Friday
    November 10th 2016 Week 46th Thursday
    November 9th 2016 Week 46th Wednesday
    November 8th 2016 Week 46th Tuesday
    windows 7文件共享方法
    Win7无线网络共享设置方法
    常量指针和指针常量
    如何查找局域网的外网ip
  • 原文地址:https://www.cnblogs.com/xiaopi-python/p/7134375.html
Copyright © 2011-2022 走看看