標籤:ddr .post efault div 項目 nal 隱藏 http success
一,django models
1,django ORM擷取後台資料的方式,總共有三種
(1)v1 = models.Business.objects.all()
傳回值為QuerySet類型,內部元素都是對象
[obj(id,caption,code),obj(id,caption,code),obj(id,caption,code)]
(2)v2 = models.Business.objects.all.values(‘id‘,‘caption‘)
傳回值為QuerySet類型,內部元素都是字典
[{‘id‘:1,‘caption‘:‘營運部‘},{‘id‘:2,‘caption‘:‘市場部‘},...]
(3)v3 = models.Business.objects.all.values_list(‘id‘,‘caption‘)
傳回值為QuerySet類型,內部元素都是元組
{(1,營運部),(2,開發)}
2,models.Business.objects.get(id=1) 擷取的值為一個對象,如果不存在就直接報錯
3,models.Business.objects.filter(id=1).first() 擷取的值為一個對象,不存在返回none
4,主機管理項目代碼,views.py取值為對象形式
(1) models 代碼from django.db import models# Create your models here.# class Foo(models.Model):# name = models.CharField(max_length=1)class Business(models.Model): # id caption = models.CharField(max_length=32) code = models.CharField(max_length=32,null=True,default="SA") # fk = models.ForeignKey(‘Foo‘)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‘) #b 為一個對象,封裝了Business表裡面的一行資料(2) views.py代碼def host(request): v1 = models.Host.objects.filter(nid__gt=0) #相當於models.Host.objects.all() for row in v1: print(row.nid,row.hostname,row.ip,row.port,row.b_id,row.b.caption,row.b.code,row.b.id,sep=‘\t‘) return HttpResponse(request,‘host.html‘,{‘v1‘:v1})(3)templates host.html <table border="1"> <thead> <tr> <th>序號</th> <th>主機名稱</th> <th>IP</th> <th>連接埠</th> <th>業務線名稱</th> <th>操作</th> </tr> </thead> <tbody> {% for row in v1 %} <tr hid="{{ row.nid }}" bid="{{ row.b_id }}"> #隱藏掉Host的nid列和Business的id列 <td>{{ forloop.counter }}</td> <td>{{ row.hostname }}</td> <td>{{ row.ip }}</td> <td>{{ row.port }}</td> <td>{{ row.b.caption }}</td> <td> <a class="edit">編輯</a>|<a class="delete">刪除</a> </td> </tr> {% endfor %} </tbody> </table>
5,主機管理,views.py取值為字典形式
(1)views.py代碼def host(request): v2 = models.Host.objects.filter(nid__gt=0).values(‘nid‘,‘hostname‘,‘b_id‘,‘b__caption‘) #b跨表查詢為__雙下划下 # QuerySet: [ {} ] # print(v2) # for row in v2: # print(row[‘nid‘],row[‘hostname‘],row[‘b_id‘],row[‘b__caption‘]) return render(request,‘host.html‘,{‘v2‘:v2})(2)templates html 代碼 <h1>主機列表(字典)</h1> <table border="1"> <thead> <tr> <th>主機名稱</th> <th>業務線名稱</th> </tr> </thead> <tbody> {% for row in v2 %} <tr hid="{{ row.nid }}" bid="{{ row.b_id }}"> <td>{{ row.hostname }}</td> <td>{{ row.b__caption }}</td> </tr> {% endfor %} </tbody> </table>
6,主機管理,views.py取值為元組形式
(1)views.py 代碼def host(request): v3 = models.Host.objects.filter(nid__gt=0).values_list(‘nid‘,‘hostname‘,‘b_id‘,‘b__caption‘) # QuerySet: [()] # print(v2) return render(request, ‘host.html‘, {‘v3‘: v3})(2)templates html代碼 <h1>主機列表(元組)</h1> <table border="1"> <thead> <tr> <th>主機名稱</th> <th>業務線名稱</th> </tr> </thead> <tbody> {% for row in v3 %} <tr hid="{{ row.0 }}" bid="{{ row.2 }}"> <td>{{ row.1 }}</td> <td>{{ row.3 }}</td> </tr> {% endfor %} </tbody> </table>
7,templates 中的for 迴圈的特殊值
(1)forloop.counter 迴圈計數器(從1開始計數,可以用作序號列)
(2)forloop.counter0 迴圈計數器(從0開始計數)
(3)forloop.revcounter 迴圈計數器(倒序從從1開始計數)
(4)forloop.revcounter0 迴圈計數器(倒序從0開始計數)
(5)forloop.last 是否是最後一個 forloop.first是否是第一個
8, ajax 內容
(1)ajax 前端程式碼範例
$.ajax({url: ‘/host‘, #提交的urltype: "POST", #提交的方式data: {‘k1‘: 123,‘k2‘: "root"}, #提交的資料success: function(data){ #後台返回資料後,觸發的函數// data是伺服器端返回的字串 var obj = JSON.parse(data);}})
(2)ajax views.py返回的時候需要用HttpResponse("字串")
如果view.py擷取的值為字典,則需要用json.dumps("字典"),然後返回 return HttpResponse(json.dumps("字典")
前端接收字串之後進行還原序列化轉化成對象 在Javascript 中用var obj=JSON.parse(data)
前端將對象轉化成字串,在Javascript中用JSON.stringify(),例如 list=[1,2,3,4],將列錶轉化為字串J SON.stringify(list)
(3)ajax 後台返回可用HttpResponse() 和render(只含有字串)
(4)ajax 擷取form 中的所有值data:$(‘#add_form‘).serialize()
9,models 多對多自訂關係表定義方式
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‘)class Application(models.Model):name = models.CharField(max_length=32)class HostToApp(models.Model):hobj = models.ForeignKey(to=‘Host‘,to_field=‘nid‘) #Host表中的一行對象aobj = models.ForeignKey(to=‘Application‘,to_field=‘id‘) #Application表中的一行對象
10,models 自動建立多對多關係表
(1)models.py程式碼範例
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‘)class Application(models.Model):name = models.CharField(max_length=32)r = models.ManyToManyField("Host") #預設最多隻能建立兩列的關聯關係
(2)資料操作
1, obj =Application.objects.get(id=1)
obj 對象包含兩個內容,obj.name,obj.r,
如果要增加值obj.r.add(1) 表示在第三張表中增加一個1,對應1,即host id為1,application id為1
obj.r.add(2) 表示在第三張表中增加一個1,對應2,即host id 為2,application id 為1
另外增加可以傳一個列表[1,2,3,4] obj.r.add(*[1,2,3,4])增加一個application id 為1,host id 為1,2,3,4 即1-1,1-2,1-3,1-4
2, obj.r.remove(1),刪除掉1-1
obj.r.remove(*[1,2,3]),刪除1-1,1-2,1-3
obj.r.remove(2,4),刪除1-2,1-4
3,obj.r.clear() 清除application為1的所有關聯資料
4,obj.r.set([3,5,7])表示設定application為1,所有關聯只有3,5,7,即只有1-3,1-5,1-7
5,obj.r.all()擷取所有application id 為1 的關聯的主機對象“列表”
11,ajax 內容補充
(1)
$.ajax({url: ‘/host‘, #提交的urltype: "POST", #提交的方式data: {‘k1‘: 123,‘k2‘: "root"}, #提交的資料 dataType:‘JSON‘, #將後台返回的資料轉化為json對象,不再需要JSON.parse轉化success: function(obj){ #後台返回obj對象,觸發的函數// data是伺服器端返回的字串}})
(2)發給後端的資料包含列表
$.ajax({url: ‘/host‘, #提交的urltype: "POST", #提交的方式data: {‘k1‘: 123,‘host_list‘: [1,2,3]}, #提交的資料 dataType:‘JSON‘, #將後台返回的資料轉化為json對象,不再需要JSON.parse轉化 traditional:true, #將host_list列錶轉為字串success: function(obj){ #後台返回obj對象,觸發的函數// data是伺服器端返回的字串}})#views.py擷取 request.POST.getlist(‘host_list‘) #可以擷取host_list列表中的所有值
Python 學習第二十天 django知識