Django 数据部分操作
- 一对多关系
- 表单数据
- 表单数据的三种获取方式
- Ajax提交数据
- 多对多关系
一对多关系
使用外键进行一对多关系的创建
业务线
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()