python Django数据部分操作

Django 数据部分操作

  1. 一对多关系
  2. 表单数据
  3. 表单数据的三种获取方式
  4. Ajax提交数据
  5. 多对多关系

一对多关系

使用外键进行一对多关系的创建

业务线

class Business(models.Model):
    #id
    caption = models.CharField(max_length=32)
    code = models.CharField(max_length=32,null=True,default='sa')

创建一个主机表

class Host(models.Model):
    nid = models.AutoField(primary_key=True)
    hostname = models.CharField(max_length=32,db_index=True)
    # ip = models.IPAddressField(db_index=True)
    ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
    port = models.IntegerField()
    b = models.ForeignKey(to="Business",to_field='id',on_delete=models.CASCADE)

表单数据

form 表单提交数据,及相关js部分操作

html部分

    <div class="add_modal hide">

    <form id="add_form" action="/host/" method="post">
        <div class="group">
            <input id="host" type="text" placeholder="主机名" name="hostname">
        </div>

        <div class="group">
            <input id="ip" type="text" placeholder="IP" name="ip">
        </div>

        <div class="group">
            <input id="port" type="text" placeholder="端口" name="port">
        </div>
        <div class="group">
            <select id="sel" name="b_id">
                {% for op in b_list %}
                <option value="{{ op.id }}">{{ op.caption }}</option>
                {% endfor %}
            </select>
        </div>

        <input type="submit" value="提交">
        <a href="" id="ajax_submit" style="display: inline-block;padding: 5px;background: blue;
        color:white;text-decoration: none; white;">
            悄悄提交</a>
        <input id="cancel" type="button" value="取消">
        <span id="error_msg" style="color: red;"></span>
    </form>

js部分

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

            $.ajax({
                url:"/test_ajax/",
                {#type:'GET',#}
                type:'POST',
                {#data:{'hostname':$('#host').val(),'ip':$('#ip').val(),'port':$('#port').val(),'b_id':$('#sel').val()},#}
                data:$('$add_form').serialize(),
                success:function (data) {{% comment %}
                    if(data == 'Success'){
                        location.reload()
                    }
                    else{
                       alert(data);
                    }{% endcomment %}
                    var obj = JSON.parse(data);
                    if(obj.status){
                        location.reload();
                    }
                    else{
                        $('#error_msg').text(obj.error)
                    }
                }
            })
        });

表单数据的三种获取方式

     v1 = models.Business.objects.all()
     # QuerySet ,内部元素都是对象

     # QuerySet ,内部元素都是字典
     v2 = models.Business.objects.all().values('id','caption')
     # QuerySet ,内部元素都是元组
     v3 = models.Business.objects.all().values_list('id','caption')

     # 获取到的一个对象,如果不存在就报错
     models.Business.objects.get(id=1)
     对象或者None = models.Business.objects.filter(id=1).first()

代码实例

def business(request):
    v1 = models.Business.objects.all()
    #QuerySet
    #[boj(id,caption,code),boj(id,caption,code)]

    v2 = models.Business.objects.all().values('id','caption')
    #QuerySet
    #[{'id':1,'caption':'运维部'},{}]

    v3 = models.Business.objects.all().values_list('id','caption')
    #QuerySet
    #[(1,运维部),(2,开发)]

    return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})

def host(request):
    v1 = models.Host.objects.filter(nid__gt=0)

    # for row in v1:
    #     print(row.nid,row.hostname,row.ip,row.port,row.b_id,row.b.code,row.b.id,sep='\t')

    v2 = models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
    # 在这种有filter,values,的情况下跨表取值,使用双下划线 __
    # QuerySet:[{}]
    #字典类型数据取值
    # for row in v2:
    #     print(row['nid'],row['hostname'],row['b__caption'])

    v3 = models.Host.objects.filter(nid__gt=0).values_list('nid', 'hostname', 'b_id', 'b__caption')

    return render(request, 'host.html', {'v1': v1,'v2':v2,'v3':v3})

Ajax 提交数据
模板

    $.ajax({
        url:'/host/',
        type:"POST",
        data:{'k1':123,'k2':"root"},
        success:function(data){
            // data 是服务器端返回的字符串
            var obj = JSON.parse(data);
        }
    })

实例

           $('#add_submit_ajax').click(function () {
               $.ajax({
                   url:'/ajax_add_app/',
                   {#data:{'user':123,'host_list':[1,2,3,4]},#}
                   data:$('#add_form').serialize(),
                   type:"POST",
                   dataType:'JSON',
                   traditional:true,
                   success:function (obj) {
                       console.log(obj);

                   },
                   error:function () {
                   }
               })
           });

   //建议:永远让服务器端返回一个字典
   //return HttpResponse(json.dumps(字典))

多对多关系:

创建多对多关系,两种方式:
	1,自定义关系表
	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)
        # 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()
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值