Fork me on GitHub

python自动化编程-第二十天 django


上节内容回顾

设置pycharm的环境变量;
-w1030

-w1071

获取单表操作三种方式

    v1 = models.Business.objects.all()
    # QuerySet
    # [obj(id,caption,code),obj(id,caption,code),obj(id,caption,code),obj(id,caption,code)]
    # 都是对象


    v2 = models.Business.objects.all().values('id','caption')
    # QuerySet
    # [{'id':1,'caption':xxx},{'id':2,'caption':xxx},{'id':3,'caption':xxx},{'id':4,'caption':xxx}]
    # 都是字典


    v3 = models.Business.objects.all().values_list('id','caption')

    # QuerySet
    # [(1,xxx),(2,xxx),(3,xxx),(4,xxx),]
    # 都是元组
    
    v4 = models.Business.objects.get(id=4)
    # 获取到一个对象,如果不存在就报错;
    # v4 = models.Business.objects.filter(id=4).first()
    # filter().first() 不会报错;

filter条件:

__gt    >
__lt    <

__gte   >=
__lte   <=

跨表的三种操作方式

 v1 = models.Host.objects.all()
 v1[0].b.caption
 # 外键对象的基本取值方法
 
 
 v2 = models.Host.objects.filter(id=4).values('uid','hostname','b__caption') 
 # 此处不能使用. 来跨表
 # 但是可以使用__ 来跨表
 # 总结,filter,或者all(),后面的查询条件,要想跨表,则需要使用__;
 
 
 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')
# 取值时使用索引
 

模板语言for

每个for循环都有一个forloop
forloop.counter 就是一个计数器,每循环一次就增加1;
forloop.counter0 表示从0开始
forloop.revcounter 倒序
forloop.revcounter0 从0开始的倒序
forloop.last 判断是否是最后一次循环
forloop.first 判断是否是第一次循环
forloop.parentloop :查看父循环上面6个属性的值

Ajax

就是通过jquery来提交

$.ajax({
    url:'/host',
    type:'POST',
    data:{'k1':'v1','k2','v2'},
    //data:$('#add-form').serialize(),
    success:function(data){
        执行成功后,自动执行该函数;
        此处的data参数时,服务器端views函数中,返回的字符串;
        var obj = JSON.parse(data);
    },
})

$.get =》 本质上是调用ajax,type改成了“GET”
$.post =》 本质上是调用ajax,type改成了“POST”

建议:永远让服务器端返回一个字典

return HttpResponse(json.dumps(字典))

不能使用redirect,不建议使用render,render只能返回XML

多对多

创建多对多

方式1: 自定义关系表

class Business(models.Model):
    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.GenericIPAddressField(protocol='IPv4',db_index=True)
    port = models.IntegerField()
    b = models.ForeignKey('Business',to_field='id',on_delete=None)


class Application(models.Model):
    name = models.CharField(max_length=32)

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

方式二:自动创建关系表
缺点:最多只能有3列;

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('Business',to_field='id',on_delete=None)


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) # 表示 app_id =1 ,host_id=1
obj.r.add(2) # 表示 app_id =1 ,host_id=2

obj.r.add(1,2,3,4) # 表示在r表中,增加4行
obj.r.add(*[1,2,3,4,]) # 表示在r表中,增加4行

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

obj.r.clear() # 表示删除所有 app_id=1的
obj.r.set([3,5,7]) # 更新,就是先全部删除,然后添加列表里面的数据

obj.r.all() # 所有相关的

posted @ 2019-04-13 18:24  耳_东  阅读(173)  评论(0)    收藏  举报