Python 學習第二十天 django知識

一,django modelshtml

1,django ORM獲取後臺數據的方式,總共有三種前端

(1)v1 = models.Business.objects.all()ajax

    返回值爲QuerySet類型,內部元素都是對象django

    [obj(id,caption,code),obj(id,caption,code),obj(id,caption,code)]json

(2)v2 = models.Business.objects.all.values('id','caption')後端

        返回值爲QuerySet類型,內部元素都是字典服務器

    [{'id':1,'caption':'運維部'},{'id':2,'caption':'市場部'},...]app

(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',                                        #提交的url
	type: "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',                                        #提交的url
	type: "POST",                                        #提交的方式
	data: {'k1': 123,'k2': "root"},                      #提交的數據
        dataType:'JSON',                                     #將後臺返回的數據轉化爲json對象,再也不須要JSON.parse轉化
	success: function(obj){                              #後臺返回obj對象,觸發的函數
		// data是服務器端返回的字符串
		}
})

 (2)發給後端的數據包含列表

$.ajax({
	url: '/host',                                        #提交的url
	type: "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列表中的全部值
相關文章
相關標籤/搜索