python自动化编程-第二十天 django
上节内容回顾
设置pycharm的环境变量;


获取单表操作三种方式
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() # 所有相关的


浙公网安备 33010602011771号