1. 程式人生 > >(轉)python 全棧開發,Day73(django多表新增,基於物件的跨表查詢)

(轉)python 全棧開發,Day73(django多表新增,基於物件的跨表查詢)

昨日內容回顧

多表方案:
    如何確定表關係呢?
    表關係是在2張表之間建立的,沒有超過2個表的情況。
    那麼相互之間有2條關係線,先來判斷一對多的關係。
    如果其中一張表的記錄能夠對應另外一張表的多條記錄,那麼關係線成立!
    
    如果只有一條線成立,那麼就是一對多的關係。
    如果有2條線成立,那麼就是多對多的關係。
    
    比如book和publish。一本書不能對應多個出版社(常規是這樣的,否則就盜版了),那麼不成立。
    一個出版社可以對應多本書,關係線成立。所以book和publish表的關係是一對多的關係
    
    多對多的關係,就是2張表互相對應多條記錄。
    比如book和author。一本書可以有多個作者,一個作者可以寫多本!
    
    一對一的關係,就很簡單了,彼此唯一。
    比如author和authordetail是一對一的關係。
    
    
    一對多:
        book和publish表的關係是一對多的關係
    
        一旦確定一對多的關係:在多的表中建立關聯欄位
            
# 與Publish建立一對多的關係,外來鍵欄位建立在多的一方 publish=models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE) #建立的欄位名為publish_id。它會自動加_id字尾 多對多: book和author是多對多的關係 一旦確定多對多的關係:建立第三張關係表 # 與Author表建立多對多的關係,ManyToManyField可以建在兩個模型中的任意一個,自動建立第三張表
authors=models.ManyToManyField(to="Author") #注意:表名為應用名+book類名小寫+authors,也就是book_authors。 #它只有3個欄位,分別是主鍵id,book_id,author_id。 #book_id和author_id分別表示book表和author表的主鍵id 一對一: author和authordetail是一對一的關係 一旦確定一對一的關係 : 建立關聯欄位(任意一張表建立都可以)
#但是一般,我們會判斷誰是重要的,誰是次要的。在重要的表上面建立關聯欄位!比如author #由於authordetail表是author表的延伸,所以在author表建立關聯欄位 # 與AuthorDetail建立一對一的關係 ad=models.OneToOneField(to="AuthorDetail",to_field="id",on_delete=models.CASCADE,) #建立的欄位名為ad_id,它會自動加_id字尾。一對一關聯欄位,必須設定唯一屬性!
View Code

 

一、django多表新增

昨天已經把5張表,都創建出來了。models.py裡面有4個模型,其中第5張表,是book表和author表的關係表。

由book類的authors屬性來建立了關係表,表名為:應用名+book+'_'+authors。

修改urls.py,新增add路徑

from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('add/', views.add),
]
View Code

由於pycharm對sqlite資料庫的時間欄位,新增時,會自動轉換為時間戳。

這樣很不好,所以我使用navicat來連線。

新建一個連線

找到表publish

 新增2條記錄

新增表記錄

create(**kwargs) 建立新物件

返回值是新增的model物件

一對一

舉例:新增一條作者資訊

姓名=hong,年齡=25,女朋友=唐安琪,電話=1314

def add(request):
    #先新增作者詳細資訊
    hong_gf = AuthorDetail.objects.create(gf="唐安琪",tel=1314)
    #再新增作者,因為它依賴AuthorDetail表
    hong = Author.objects.create(name="hong",age="25",ad=hong_gf)
    print(hong)

    return HttpResponse('新增成功')
View Code

注意:因為author的ad屬性是關聯authordetail表,必須新增authordetail表,才能新增author表。

ad必須接收一個model物件。可以從這個model物件中,獲取插入的id值。

重新整理頁面,檢視authordetail表,發現多了一條記錄

檢視author表,發現多了一條記錄

 

一對多

方式1(推薦)

修改views.py,增加add檢視函式

from django.shortcuts import render,HttpResponse
from app01.models import Book
# Create your views here.

def add(request):
    #publish_id就是Book類的publish屬性。它的欄位為publish_id
    book = Book.objects.create(title='西遊記',price=100,pub_date="1743-4-12",publish_id=2)
    print(book.title) #列印title
    return HttpResponse('新增成功')
View Code

訪問url:http://127.0.0.1:8000/add/

檢視book表記錄,發現多了一條

方式2

新增一本書《三國演義》,指定出版社為西瓜出版社

首要要匯入Publish

def add(request):
    xigua = Publish.objects.filter(name="西瓜出版社").first()  #model物件
    book = Book.objects.create(title='三國演義',price=300,pub_date="1643-4-12",publish=xigua)
    print(book.title) #列印標題
    print(book.publish)  # 與這本書籍關聯的出版社物件
    print(type(book.publish))  # 列印屬性
    print(book.publish.id)  # 出版社id
    print(book.publish.name)  # 出版社name
    
    return HttpResponse('新增成功')
View Code

注意:xigua它是一個model物件,它表示publish表的一條記錄

create裡面的publish只能接收publish表的model物件,不能接收別的表model物件!

檢視models.py的Book類的publish屬性

publish=models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE)

注意:它只能接收publish表的id欄位。

所以執行sql時,它相當於publish_id=xigua.id。

這種新增方式,有嚴格的限制,必須接收publish的model物件才可以的。不推薦使用

 

檢視控制檯資訊:

三國演義
[29/Jun/2018 16:47:44] "GET /add/ HTTP/1.1" 200 12
Publish object (1)
<class 'app01.models.Publish'>
1
西瓜出版社
View Code

book.publish 是與這本書籍關聯的出版社物件

那麼就可以得到出版社的id和name屬性值

 

查看錶記錄,發現多了一條

 

現在書籍和作者還沒有繫結關係,先增加作者詳細記錄
修改authordetail表,增加2條記錄

修改author表,增加2條記錄

多對多

現在需要在book表裡面插入一本書《python》,這本書有2個作者。那麼book_authors應該有2條記錄

它應該是這樣的

id book_id author_id
1        3        1
2        3        2
View Code

那麼如何將這2條記錄,插入進去呢?

修改add檢視函式,注意匯入author類

先插入一條記錄

book = Book.objects.create(title='python',price=122,pub_date="2012-12-12",publish_id=1)

再獲取2個作者

xiao = Author.objects.filter(name="xiao").first()
zhang = Author.objects.filter(name="zhang").first()

最後插入2條記錄,注意:下面2行程式碼是不能執行的,它是虛擬碼!

book_authors.objects.create(book_id=book.id,author_id=xiao.id)
book_authors.objects.create(book_id=book.id, author_id=zhang.id)

上面2行程式碼表示在book_authors表中新增2條記錄,只增加book_id和author_id。

那麼問題來了,book_authors這張表是用orm建立的
但是orm的models.py裡面找不到book_authors這張表的模型類。如果存在的話,那肯定沒有問題的。
因為第3張表,是在book類裡面的authors屬性,用ManyToManyField建立的
因為一本書,對應的不止一個作者,所以不能直接賦值操作。

 

add() 增加多個關係物件

使用方法1:add(obj1, obj2, ...) 

ORM提供了add方法,來新增多對多的關係表。

def add(request):
    book = Book.objects.create(title='python',price=122,pub_date="2012-12-12",publish_id=1)
    xiao = Author.objects.filter(name="xiao").first()
    zhang = Author.objects.filter(name="zhang").first()
    book.authors.add(xiao,zhang)  # 新增2條資料,接收一個引數,就會產生一條記錄

    return HttpResponse('新增成功')
View Code

注意:book.authors.add(xiao,zhang),相當於執行上面2句虛擬碼!

它會自動獲取2個物件的主鍵id,並插入到對應的欄位中。

重新整理頁面,檢視book表,發現多了一條記錄

檢視book_authors表,發現多2條資料

 

如果需要為書籍繫結所有作者呢?

author_list = Author.objects.all()
book.authors.add(*author_list)

上面2行程式碼,就搞定了,非常簡潔!

 

使用方法2:add(主鍵1, 主鍵2, ...) 

下面這種寫法,也是可以的。在html表單頁面新增時,會用到此寫法!

book.authors.add(1,2)

還有一種寫法,是屬於python的。*[1,2],表示打散。它相當於上面的寫法

book.authors.add(*[1,2])

區別在於:add(1,2)這種寫法,它是執行了2次,在book_authors表中插入2條記錄。

那麼在不知道有多少數值的情況下,需要使用*[args1,args2]這種寫法。

注意:在html表單中的複選框中,它提交的資料是多個值,必須使用getlist方法獲取,它是列表型別。

因為不知道使用者,到底會選擇多少個選項。所以就需要使用這種打散寫法!

 

刪除記錄

remove(obj1, obj2, ...) 去除多個關係物件

舉例:刪除python這本書的xiao作者
那麼只需要刪除book_authors表,id為1的這一條記錄,就可以了

但是,不能直接對這張表,直接刪除。因為它是2個表的關聯表。

 解除繫結的關係

def add(request):
    book = Book.objects.filter(id=3).first()  # 先找到這本書
    xiao = Author.objects.filter(name="xiao").first()  # 再找到作者
    book.authors.remove(xiao)  # 解除繫結的關係
    return HttpResponse('新增成功')
View Code

重新整理頁面,檢視book_authors表記錄,發現作者沒有了

注意:這裡可不是級聯刪除,book_authors並沒有on_delete=models.CASCADE屬性

 

clear() 清理所有關係物件

修改book_authors表記錄,新增1條記錄

 

舉例:將book_id等於3的所有的作者刪除

上面的例子,用remove,可以將一個刪除。如果這本書,有5個作者呢?

 一個個remove?太累了!django提供了clear方法,可以清理所有關係物件。

def add(request):
    book = Book.objects.filter(id=3).first()
    book.authors.clear()  # 清理所有關係物件
    return HttpResponse('新增成功')
View Code

重新整理頁面,再次檢視book_authors表記錄,發現已經空了!

 

修改authordetail表,增加一條記錄

修改author表,增加一條記錄

修改book_authors表,增加3條資料

 

set([obj1,obj2...])  先清空再設定

set([obj1,obj2,...])  它接收多個值,可以一個,也可以多個。適用於後臺網頁修改操作!

舉例:

python這本書目前有3個作者,將wang設定為這本書的唯一作者

怎麼做呢?將另外2個作者解除關係就可以了。

def add(request):
    book = Book.objects.filter(id=3).first()  # 先找到書
    xiao = Author.objects.filter(name="xiao").first()  # 再找到作者
    zhang = Author.objects.filter(name="zhang").first()
    book.authors.remove(xiao,zhang)  # 解除繫結的關係
    
    return HttpResponse('新增成功')
View Code

但是這樣將2個作者解除,太麻煩了。

還有一種做法,先清空,再設定

def add(request):
    book = Book.objects.filter(id=3).first()  # 先找到書
    book.authors.clear()  # 清理所有關係物件
    wang = Author.objects.filter(name="wang").first()
    book.authors.add(wang)

    return HttpResponse('新增成功')
View Code

django提示了set方法,直接合並了先清空再設定的操作

它必須接收一個數組,因為可以接收多個值

def add(request):
    book = Book.objects.filter(id=3).first()  # 先找到書
    wang = Author.objects.filter(name="wang").first()  # 再找作者
    book.authors.set([wang])  #先清空再設定

    return HttpResponse('新增成功')
View Code

重新整理頁面,檢視book_authors表記錄,發現只有一條了

 

總結:

重點掌握create,add,remove,clear,set這五個方法!

新增表記錄:

  一對一和一對多,使用create方法。它有2種使用方法:

    1. create(欄位名1=值1...)。適用於表單新增操作!注意,這裡面的欄位名是ORM建立表之後的的欄位名

      比如: book類的publish屬性,它是關聯欄位,ORM建立之後,欄位名為publish_id

    2.create(模型類屬性1=值1...)。比如book類的publish屬性,它是關聯欄位。

      直接create(publish=obj1),注意,它接收一個model物件,物件包含了主鍵id

  多對多使用add方法。add用2種使用方法:

    1.add(obj1,obj2...) 它接收一個model物件,物件包含了主鍵id

    2.add(主鍵id1,主鍵id2...) 它接收一個主鍵id。適用於表單新增操作!

    還有一個python的打散語法,前面加一個*就可以了。比如*[1,2],它會依次呼叫前置方法,每次只取一個值。表單操作,會用到!

 

 刪除記錄:

  適用於一對一,一對多,多對一。

  remove(obj1, obj2, ...) 去除多個關係物件。它需要指定一個或者多個物件

  clear() 清理所有關係物件。不管現有的關係有多少,一律清空!

  set([obj1,obj2...]) 先清空再設定。不管現有的關係有多少,一律清空再設定。適用於網頁後臺修改操作

 

基於物件的跨表查詢(子查詢)

先來查詢id為3的書籍,列印publish和authors是什麼?

def add(request):
    book = Book.objects.filter(id=3).first()
    print(book.publish)  # 檢視publish屬性
    print(book.authors)
    print(type(book.authors))  # 檢視型別
    print(book.authors.all())  # 返回所有book的關聯物件
    print(book.authors.all().values())  # 檢視關聯物件的值

    return HttpResponse('新增成功')
View Code

重新整理頁面,檢視控制檯資訊

Publish object (1)
app01.Author.None
<class 'django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager'>
<QuerySet [<Author: Author object (3)>]>
<QuerySet [{'name': 'wang', 'age': 27, 'id': 3, 'ad_id': 3}]>
View Code

注意:book.authors不能直接print,否則返回的值是None。它是一個多對多的關係管理器,必須用all()才能取值。

book.authors.all() 表示返回所有book的關聯物件。注意:這裡的book物件,是一個model物件,它是表示id為3的一條記錄。從最後一條列印資訊中,就可以看出來!

 

修改book_authors表,新增2條記錄

再次重新整理頁面,檢視控制檯資訊

Publish object (1)
app01.Author.None
<class 'django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager'>
<QuerySet [<Author: Author object (1)>, <Author: Author object (2)>, <Author: Author object (3)>]>
<QuerySet [{'name': 'xiao', 'id': 1, 'ad_id': 1, 'age': 25}, {'name': 'zhang', 'id': 2, 'ad_id': 2, 'age': 26}, {'name': 'wang', 'id': 3, 'ad_id': 3, 'age': 27}]>
View Code

注意最後一條資訊,它返回了3個model物件。為什麼會返回3條資訊呢?

它實際是執行了下面這句SQL

SELECT
    author.id,
    author.name,
    author.age,
    author.ad_id
FROM
    author
INNER JOIN book_authors ON (
    author.id = book_authors.author_id
)
WHERE
    book_authors.book_id = 3
LIMIT 21;
View Code

因為book的id為3,它先從關係表book_authors,查詢book_id=3的記錄。此時有3條記錄!

再和author表關聯查詢,找出3個作者的記錄。所以最終結果就是author的3條記錄!

book.authors.all()是與這本書關聯的作者物件queryset物件集合

 

django有2個日期型別,一個是DateField(),它的格式是yyyy-mm-dd

還有一個型別是DateTimeField(),它的格式是yyyy-mm-dd h:i:s。它是帶時分秒的!

python中的datetime

舉例:

import datetime
now = datetime.datetime.now()
print(now)  # 當前時間
print(now.today())  # 當前時間
print(now.date())  # 日期
print(now.time())  # 排除日期,取時分秒
print(now.strftime("%Y-%m-%d %H:%I:%S"))  # 格式化時間

delta = datetime.timedelta(days=3)  # 時間差
print(delta)
print(now+delta)  # 3天后
print(now-delta)  # 3天后
View Code

輸出:

2018-06-29 20:59:02.741780
2018-06-29 20:59:02.741781
2018-06-29
20:59:02.741780
2018-06-29 20:08:02
3 days, 0:00:00
2018-07-02 20:59:02.741780
2018-06-26 20:59:02.741780
View Code

 

一對多查詢(Publish 與 Book)

book_authors表新增2條資料

舉例:

查詢西遊記這本書的出版社的名字

普通寫法

先找出這本書,然後取出publish_id。在publish表中,通過publish_id找到對應記錄。

def add(request):
    book = Book.objects.filter(title="西遊記").first()
    publish_id = book.publish_id
    publish = Publish.objects.filter(id=publish_id).first()
    print(publish.name)

    return HttpResponse('新增成功')
View Code

重新整理網頁,檢視控制檯,輸出:

榴蓮出版社

推薦寫法:

上面的步驟太麻煩了,下面使用簡潔寫法,2行就搞定了!

def add(request):
    book = Book.objects.filter(title="西遊記").first()
    print(book.publish.name)

    return HttpResponse('新增成功')
View Code

 

舉例:查詢西瓜出版社出版過的所有書籍的名稱

def add(request):
    publish = Publish.objects.filter(name="西瓜出版社").first()  # 先找出版社
    ret = Book.objects.filter(publish_id=publish.id).values("title")  # 再找書籍
    print(ret)

    return HttpResponse('新增成功')
View Code

重新整理網頁,檢視控制檯,效果同上

上面寫的太麻煩,下面來介紹正向查詢和反向查詢

 

正向和反向,就看關鍵欄位在哪裡?
如果是通過關聯欄位查詢,就是正向。否則是反向!

簡單來說:正向,按照欄位。反向,按照表名

 

正向與反向查詢

正向查詢:關聯屬性在book表中,所以book物件找出關聯出版社物件,正向查詢

反向查詢:關聯屬性在book表中,所以publish物件找出關聯書籍,正向查詢

    正向:按欄位:publish
book -----------> publish
     <----------- 
    反向:按表名小寫_set() 例如:publish.obj.book_set()

正向查詢

還是上面的例子:查詢西瓜出版社出版過的所有書籍的名稱

簡潔寫法:

def add(request):
    publish = Publish.objects.filter(name="西瓜出版社").first()  # 先找出版社
    # ret = Book.objects.filter(publish_id=publish.id).values("title")  # 再找書籍
    # print(ret)
    #正向查詢--簡潔寫法
    ret = publish.book_set.all().values("title")
    print(ret)

    return HttpResponse('新增成功')
View Code

重新整理網頁,控制檯輸出:

<QuerySet [{'title': '三國演義'}, {'title': 'python'}]>

 

推薦使用簡潔寫法,為什麼呢?因為如果表越來越多,那麼SQL就非常複雜。使用簡潔寫法,就能避免!

那麼它是如何實現的呢?通過Book模型類的authors屬性

authors=models.ManyToManyField(to="Author")

 

反向查詢

舉例:查詢與西瓜出版社關聯的所有書籍的名字

def add(request):
    publish = Publish.objects.filter(name="西瓜出版社").first()  # 先找出版社
    ret = publish.book_set.all().values("title")  # 再找書籍,過濾title
    print(ret)

    return HttpResponse('新增成功')
View Code

重新整理網頁,控制檯輸出:

<QuerySet [{'title': '三國演義'}, {'title': 'python'}]>

 

多對多查詢 (Author 與 Book)

正向查詢:關聯屬性在book表中,所以book物件找出關聯作者集合,正向查詢

反向查詢:關聯屬性在book表中,所以author物件找出關聯書籍,正向查詢

因為記錄有多條,所以結尾要加.all()

    正向:按欄位:authors.all()
book -----------> author
     <----------- 
    反向:按表名小寫_set().all() 例如:author.obj.book_set().all()

正向查詢

舉例:查詢西遊記這本書籍的所有作者的姓名和年齡

def add(request):
    book = Book.objects.filter(title="西遊記").first()  # 先找書籍
    ret = book.authors.all().values("name","age")  # 再找作者,過濾name和age
    print(ret)

    return HttpResponse('新增成功')
View Code

重新整理網頁,控制檯輸出:

<QuerySet [{'age': 25, 'name': 'xiao'}]>

 

反向查詢

舉例:查詢作者xiao出版過的所有書籍名稱

def add(request):
    xiao = Author.objects.filter(name="xiao").first()  # 先找作者
    ret = xiao.book_set.all().values("title")  # 再找書籍,過濾title
    print(ret)

    return HttpResponse('新增成功')
View Code

重新整理網頁,控制檯輸出:

<QuerySet [{'title': 'python'}, {'title': '西遊記'}]>

 

一對一查詢(Author 與 AuthorDetail)

正向查詢:關聯屬性在author表中,所以author物件找出關聯作者詳細資訊物件,正向查詢

反向查詢:關聯屬性在book表中,所以author物件找出關聯書籍,正向查詢

因為記錄只有一條,所以直接.ad就可以了。ad是關聯欄位

    正向:按欄位:.ad
author -----------> authordetail
     <----------- 
    反向:按表名小寫 例如:authordetail_obj.author

正向查詢

舉例:查詢xiao的女朋友的名字

def add(request):
    xiao = Author.objects.filter(name="xiao").first()  # 先找作者
    ret = xiao.ad.gf  # 再找女朋友
    print(ret)

    return HttpResponse('新增成功')
View Code

重新整理網頁,控制檯輸出:

趙麗穎

 

反向查詢

舉例:查詢手機號為112的作者名字

def add(request):
    phone = AuthorDetail.objects.filter(tel="112").first()  # 先找號碼
    ret = phone.author.name  # 再找作者的名字
    print(ret)
View Code

重新整理網頁,控制檯輸出:

wang

 

週末作業

基於多表的圖書管理系統

注意:出版社和作者,是從資料庫中讀取的。

作業是複選框,可以選擇多個

 編輯頁面,作者一欄的灰色背景。表示現有繫結的作者!

它是選擇狀,使用selected屬性

提示:

檢視函式接收復選框的值,需要使用request.POST.getlist()。使用get只能獲取一個值!

 

答案

修改urls.py,新增路徑

from django.contrib import admin
from django.urls import path,re_path

from book import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index),
    path('index/', views.index),
    path('books/add/', views.add),
    path('books/manage/', views.manage),
    re_path('books/delete/(?P<id>\d+)', views.delete),
    re_path('books/modify/(?P<id>\d+)', views.modify),
]
View Code

修改settings.py

註冊app

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'book',
]
View Code

指定模板路徑

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
View Code

預設使用sqlite3資料庫,有需要的使用其他資料庫的,自行更改

指定靜態資源路徑

STATIC_URL = '/static/'
STATICFILES_DIRS=[
    os.path.join(BASE_DIR,"static")
]
View Code

手動建立templates和static目錄。

在static目錄建立css目錄,下載bootstrap 3.3.7的資料包。將將bootstrap.min.css放到css目錄

 

修改models.py

相關推薦

python 開發Day73(django新增,基於物件查詢)

昨日內容回顧 多表方案: 如何確定表關係呢? 表關係是在2張表之間建立的,沒有超過2個表的情況。 那麼相互之間有2條關係線,先來判斷一對多的關係。 如果其中一張表的記錄能夠對應另外一張表的多條記錄,那麼關係線成立! 如果只

python 開發Day67(Django簡介)

昨日內容回顧 1. socket建立伺服器 2. http協議: 請求協議 請求首行 請求方式 url?a=1&b=2 協議 請求頭 key:value 請求體 a=1&b

python 開發Day68(Django的路由控制)

昨日內容回顧 1 MVC和MTV MTV 路由控制層(分發哪一個路徑由哪一個檢視函式處理) V : views (邏輯處理) T : templates (存放html檔案) M :

python 開發Day76(Django元件-cookie,session)

 昨日內容回顧 1 json 輕量級的資料交換格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy()

python 開發Day75(Django與Ajax,檔案上傳,ajax傳送json資料,基於Ajax的檔案上傳,SweetAlert外掛)

昨日內容回顧 基於物件的跨表查詢 正向查詢:關聯屬性在A表中,所以A物件找關聯B表資料,正向查詢 反向查詢:關聯屬性在A表中,所以B物件找A物件,反向查詢 一對多: 按欄位:xx book --

python 開發Day74(基於雙下劃線的查詢,聚合查詢,分組查詢,F查詢,Q查詢)

昨日內容回顧 # 一對多的新增方式1(推薦) # book=Book.objects.create(title="水滸傳",price=100,pub_date="1643-4-12",publish_id=1) # print(book.title) # 一對多的新增

python 開發Day72(昨日作業講解,昨日內容回顧,Django建立)

昨日作業講解 1.圖書管理系統 實現功能:book單表的增刪改查 1.1 新建一個專案bms,建立應用book。過程略... 1.2 手動建立static目錄,並在目錄裡面建立css資料夾,修改settings.py,設定static的目錄位置 STATI

python 開發Day71(模型層-單操作)

昨日內容回顧 1. {% include '' %} 2. extend base.html: <html> ..... ..... .....

python 開發Day70(模板自定義標籤和過濾器,模板繼承 (extend),Django的模型層-ORM簡介)

昨日內容回顧 檢視函式: request物件 request.path 請求路徑 request.GET GET請求資料 QueryDict {} request.POST POST請求資料 Que

python 開發Day79(Django的使用者認證元件,分頁器)

一、Django的使用者認證元件 使用者認證  auth模組 在進行使用者登陸驗證的時候,如果是自己寫程式碼,就必須要先查詢資料庫,看使用者輸入的使用者名稱是否存在於資料庫中; 如果使用者存在於資料庫中,然後再驗證使用者輸入的密碼,這樣一來就要自己編寫大量的程式碼。 事實上,Djang

python 開發Day78(Django元件-forms元件)

一、Django元件-forms元件 forms元件 django中的Form元件有以下幾個功能: 生成HTML標籤 驗證使用者資料(顯示錯誤資訊) HTML Form提交保留上次提交資料 初始化頁面顯示內容 校驗欄位功能 之前寫的檢視函式,提交的資料,

python 開發Day84(django請求生命週期,FBV和CBV,ORM拾遺,Git)

一、django 請求生命週期 流程圖: 1. 當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端請求頭和請求體中會包含瀏覽器的動作(action),這個動作通常為get或者post,體現在url之中. 2. url經過Django中的wsgi,再經過Django的中介軟

python 開發Day81(部落格系統個人主頁,文章詳情頁)

一、個人主頁 隨筆分類 需求:查詢當前站點每一個分類的名稱以及對應的文章數 完成這個需求,就可以展示左側的分類 它需要利用分組查詢,那麼必須要會基於雙下劃線的查詢。 基於雙下劃線的查詢,簡單來講,就是用join。將多個表拼接成一張表,那麼就可以單表操作了! 表關係圖 圖中

python 開發Day82(點贊和踩滅,使用者評論)

一、點贊和踩滅 樣式 先來做樣式,修改article_detail.html,增加div_digg的div {% extends "base.html" %} {% block content %} <div class="article_info

python 開發Day80(部落格系統分析,部落格主頁展示)

一、部落格系統分析 資料庫的構建 首先,我們分析一個部落格系統的功能: 一個部落格可以有多個標籤(多對多) 一個部落格可以有多條評論(一對多) 一個部落格只可以有一個類別(多對一) 接下來,我們分析關係的屬性: 部落格:標題,作者,內容,釋出時間,分類(外來鍵),

python 開發Day83(部落格系統子評論,後臺管理,富文字編輯器kindeditor,bs4模組)

一、子評論 必須點選回覆,才是子評論!否則是根評論點選回覆之後,定位到輸入框,同時加入@評論者的使用者名稱 定位輸入框 focus focus:獲取物件焦點觸發事件 先做樣式。點選回覆之後,定位到輸入框,加入被評論的使用者名稱 給回覆的a標籤加一個class=reply_btn,關

自學Python開發第三次筆記pycharm的使用

文件 templates 空白 cti pycharm 模板 utf body 筆記 這幾天學習了pycharm的使用。 模板:新建:File---》settings---》File and code Templates---》PythonScript 添加頭部

python開發【第九篇】Python常用模塊一主要是re正則和collections

順序 常用模塊 內置 object 簡潔 整體 re.search lec 快速 一、認識模塊    什麽是模塊:一個模塊就是一個包含了python定義和聲明的文件,文件名就是加上.py的後綴,但其實import加載的模塊分為四個通用類別 :     1.使用python

python開發【第十一篇】Python常用模塊三hashlib,configparser,logging

錯誤 .config lte with open sha 警告 輸入 格式化 pass hashlib模塊 hashlib提供了常見的摘要算法,如md5和sha1等等。 那麽什麽是摘要算法呢?摘要算法又稱為哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固

python開發【第十篇】Python常用模塊二時間、random、os、sys和序列化

utc時間 用戶 這也 文件名 password 如何 json字符串 並且 持久 一、time模塊 表示時間的三種方式:   時間戳:數字(計算機能認識的)   時間字符串:t=‘2012-12-12‘   結構化時間:time.struct_time(tm_year=2