Django模型層:單表操做,多表操做,經常使用(很是用)字段和參數,Django-model進階

1、web應用css

2、模板的導入與繼承html

3、靜態文件相關python

4、inclusion_tag:返回html片斷web

5、模型層sql

 

1、web應用數據庫

  -s包括兩個部分:web服務器+applicationdjango

  -目前階段django項目用的web服務器是:wsgiref+applicationbootstrap

  -上線會用uwsgi+applicationapi

  -web服務器(本質是socket)都實現了wsgi協議服務器

  -wsgi:web服務網關接口,是一個協議

2、模板的導入與繼承

  如何引入靜態文件(static目錄的配置):

在setting.py文件中配置:

# STATICFILES_DIRS名字必須叫它
STATICFILES_DIRS=[
    os.path.join(BASE_DIR,'static'),
]

 

  模板的導入:

    1.寫一個好看的模板

<div>
    <div class="panel panel-primary">
        <div class="panel-heading">同城交友</div>
        <div class="panel-body">
            聯繫電話:{{ a }}
        </div>
    </div>

    <div class="panel panel-danger">
        <div class="panel-heading">
            <h3 class="panel-title">潮流社區</h3>
        </div>
        <div class="panel-body">
            網站是: <a href="http://www.baidu.com">點我</a>
        </div>
    </div>
</div>

 

    2.用在想用的地方

      

{% include '模板的名字.html' %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.css' %}">
    <link rel="stylesheet" href="{% get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.css">
{#    <link rel="stylesheet" href="/statc999/">#}

    <title>Title</title>
    <style>
        .head {
            height: 60px;
            background: #1b6d85;
        }
    </style>
</head>
<body>
<div class="head"></div>
<div class="container-fluid">
    <div class="row">
        <div class="col-md-3">
            {% include 'good.html' %}

        </div>
        <div class="col-md-9">

        </div>
    </div>
</div>
</body>
</html>

 

  模板的繼承

    -寫一個母版,base.html(留一些block(盒子)),留的盒子越多,可擴展性就越高

     

{% block top %}
      
{% endblock %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.css' %}">
    <link rel="stylesheet" href="{% get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.css">
{#    <link rel="stylesheet" href="/statc999/">#}
    {% block top %}

    {% endblock %}
    <title>Title</title>
    <style>
        .head {
            height: 60px;
            background: #1b6d85;
        }
    </style>
</head>
<body>
<div class="head"></div>
<div class="container-fluid">
    <div class="row">
        <div class="col-md-3">
            {% include 'good.html' %}
            {% block left %}

            {% endblock %}
        </div>
        <div class="col-md-9">
            {% block content %}
            <h1>我是母版的內容</h1>
            {% endblock %}
        </div>
    </div>
</div>
</body>
</html>

 

    使用:

      -在一個新的html中

 

{% extend ’base.html‘ %}
擴寫留的對應的盒子
{% block top %}
  擴寫的額內容
{% endblock %}
{% extends 'base.html' %}
{% block left %}
    我是首頁的內容
    <h1>我是index的h1標籤</h1>
    我是首頁的內容

{% endblock %}
{% block content %}
    {{ block.super }}
    <h1>我是index的內容</h1>
    {{ block.super }}

    {% load my_tag %}
    {% lqz 5 'egon' %}

{% endblock %}
index.html案例
{% extends 'base.html' %}

{% block content %}
    我是訂單的內容
    <h1>我是order的h1</h1>

    <div>
    {% load my_tag %}
    {% mytest 50 'lqz' %}
    </div>
{% endblock %}
{% block top %}
    <link rel="stylesheet" href="/static/css/order.css">
{% endblock %}
order.html案例

 

注意:

  1.擴寫的時候,盒子的位置無所謂,只要名字對應正確,就會正確填充

  2.盒子能夠不擴寫,不謝就是原來的樣子

  3.若是要寫實模板盒子中原來的東西,須要

    {{ block.super }} --- 寫在哪,原來的內容就放在哪

            

3、靜態文件相關

  1.直接寫死的:<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">

  2.用script標籤:

    {% load static %}

    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.css' %}">

  3.用get_stasic_prefix:

    {% load static %}

    <link rel="stylesheet" href="{% 用get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.css">

    

<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.css' %}">
    <link rel="stylesheet" href="{% get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.css">
{#    <link rel="stylesheet" href="/statc999/">#}
    {% block top %}

    {% endblock %}
    <title>Title</title>
    <style>
        .head {
            height: 60px;
            background: #1b6d85;
        }
    </style>
</head>

    

4、inclusion_tag:返回html片斷

  1.前面幾部跟標籤和過濾器同樣,在app建立templatetags文件夾建立my_tag.py文件

  2.裝飾器:@register.inclusion_tag('inclusion.html',name='lqz'),第一個參數是要操做的模板

from  django.template import Library
register=Library()

@register.inclusion_tag('inclusiontag.html',name='lqz')
def mytest(value,value2):
    ll= [ i for i in range(value)]
    return {'ll':ll,'a':value2}

 

  3.返回一個字典,字典中的值,能夠在inclusion中使用

  4.使用:

    {%load 你寫的那個py文件 %}

    {% 函數名字 參數 參數 %}

5、模型層

  單表操做

    -增長、刪除、改:兩種方式:queryset對象的方法,book對象的方法

    -改:須要的save()

    -get()方法:查詢的數據有且只有一條,若是多,少都會跑出異常

  

  單表查詢

      -<1> all():                              查詢全部結果
       <2> filter(**kwargs):            它包含了與所給篩選條件相匹配的對象    
       <3> get(**kwargs):              返回與所給篩選條件相匹配的對象,返回結果有且只有一個,若是符合篩選條件的對象超過一個或者沒有都會拋出錯誤。    
       <4> exclude(**kwargs):      它包含了與所給篩選條件不匹配的對象
       <5> order_by(*field):           對查詢結果排序('-id')
       <6> reverse():                     對查詢結果反向排序
       <8> count():                       返回數據庫中匹配查詢(QuerySet)的對象數量。
       <9> first():                           返回第一條記錄 
       <10> last():                         返回最後一條記錄 
       <11> exists():                     若是QuerySet包含數據,就返回True,不然返回False
       <12> values(*field):            返回一個ValueQuerySet——一個特殊的QuerySet,運行後獲得的並非一系列      model的實例化對象,而是一個可迭代的字典序列
       <13> values_list(*field):      它與values()很是類似,它返回的是一個元組序列,values返回的是一個字典序列
       <14> distinct():                    從返回結果中剔除重複紀錄

 

  單表基於雙下劃線的查詢

       Book.objects.filter(price__in=[100,200,300])
       Book.objects.filter(price__gt100)
       Book.objects.filter(price__lt=100)
       Book.objects.filter(price__gte=100)
       Book.objects.filter(price__lte=100)
       Book.objects.filter(price__range=[100,200])
       Book.objects.filter(title__contains="python")
       Book.objects.filter(title__icontains="python")
       Book.objects.filter(title__startswith="py")
       Book.objects.filter(pub_date__year=2012)

import os
if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day81.settings")
    import django
    django.setup()
    from app01 import models
    # 單表的增長兩種
    # date類型,傳的時候,能夠傳字符串(格式必須是:2018-06-17),能夠傳時間對象
    # ret=models.Book.objects.create(name='洪流嗎',price=23.7,publish='北京出版社',pub_data='2018-06-17')
    # import datetime
    # ctime=datetime.datetime.now()
    # ret=models.Book.objects.create(name='西遊記',price=45.9,publish='南京出版社',pub_data=ctime)
    # 生成對象,再調save方法
    # book=models.Book(name='三國演義',price=46.89,publish='南京出版社',pub_data='2017-08-17')
    # book.save()
    
    
    # 刪除(pk代指主鍵)
    # ret=models.Book.objects.filter(pk=1).delete()
    # book=models.Book.objects.filter(pk=1).first()
    # book.delete()
    
    
    #更新
    # ret = models.Book.objects.filter(pk=2).update(name='ddd')
    # book=models.Book.objects.filter(pk=2).first()
    # book.name='XXX'
    # # 沒有update這個方法的
    # # book.update()
    # # 既能夠保存,又能夠更新
    # book.save()
    
    
    # get方法
    # book = models.Book.objects.filter(pk=2).first()
    # book拿到的是 book對象
    # get查到的數據有且只有一條
    # book=models.Book.objects.get(name='XXX')
    # book=models.Book.objects.get(name='三國演義')
    # print(book.name)
    
    
    #     查詢的api(方法)
    # exclude(並列條件必須同時知足,也就是and)
    # book=models.Book.objects.exclude(name='三國演義',price=44)
    # # 必須是queryset對象纔有query,它就是原生的sql
    # print(book.query)
    # 如何定義一個支持鏈式操做的類(每一個方法返回的時候,返回對象自己)
    
    
    # 按價格升序排列
    # book=models.Book.objects.all().order_by('price')
    # 倒序排列
    # book = models.Book.objects.all().order_by('-price')
    # print(book.query)
    # # 必須有排序規則(在order_by以後用)才能調用reverse方法
    # book = models.Book.objects.all().order_by('price').reverse()
    # book = models.Book.objects.all().reverse()
    # print(book.query)
    # book=models.Book.objects.all().filter(name='偶露菲').count()
    # book=models.Book.objects.all().count()
    # book=models.Book.objects.all().first()
    # print(book)
    # book=models.Book.objects.all().last()
    # queryset 能夠按索引取值,可是不支持負索引
    
    
    # 能夠支持切片,其實sql就改了
    # book = models.Book.objects.all()[10:15]
    # book=models.Book.objects.all().filter(name='xx').exists()
    # values :返回結果是queryset對象,裏面套字典
    # book=models.Book.objects.all().values('name')
    # for i in book:
    #     print(i.get('name'))
    #     print(i['price'])
    # values :返回結果是queryset對象,裏面套元組
    # book=models.Book.objects.all().values_list('name','price')
    # book=models.Book.objects.all().values('price').distinct()
    
    
    # 基於雙下劃線的模糊查詢
    # 在列表範圍內
    # book=models.Book.objects.filter(price__in=[44,45])
    # print(book.query)
    # 大於
    # book = models.Book.objects.filter(price__gt=44)
    # 大於等於
    # book = models.Book.objects.filter(price__gte=44)
    # 小於
    # book = models.Book.objects.filter(price__lt=44)
    # print(book)
    # # 小於等於
    # book = models.Book.objects.filter(price__lte=45)
    # 在40--50之間
    # book=models.Book.objects.filter(price__range=[40,50])
    # print(book.query)
    # 包含 python
    # book = models.Book.objects.filter(name__contains='python')
    # 不區分大小寫的包含
    # book = models.Book.objects.filter(name__icontains='python')
    # print(book.query)
    # 以XX開通
    # book=models.Book.objects.filter(name__istartswith='X')
    # print(book.query)
    # print(book)
    # book=models.Book.objects.filter(name__endswith='義')
    # print(book.query)
    # book=models.Book.objects.filter(pub_data__year='2017')
    # book=models.Book.objects.filter(pub_data__month='01')
    # book=models.Book.objects.filter(pub_data__day='11')
    book=models.Book.objects.filter(pub_data__year='2017',pub_data__month='08')

    print(book.query)
    print(book)
View Code
相關文章
相關標籤/搜索