5個必讀常用的Django小技巧 by 搬運工大江狗

2021-02-20 Python Web與Django開發

如果你初學Django且英語不錯,相信你大概率上過simpleisbetterthancomplex.com這個網站。作者生活在芬蘭,寫過很多關於Django技巧的原創英文文章。今天小編我就借花獻佛,用中文辛苦搬運來5個我認為非常有用的Django小技巧,與大家分享。

Tip 5. 創建DateTimeField欄位時使用auto_now_add和auto_now選項

當你在給一個模型創建一個DateTimeField類型的欄位時,你可以設置auto_now_add=True和auto_now=True的選項。這樣當你創建或更新一個時間欄位時就不用手動指定或更新時間了。

class Article(models.Model):
description = models.CharField(max_length=255)
status = models.CharField(max_length=10)
author = models.ForeignKey(User)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

創建模型各個欄位時的注意事項見Django基礎核心技術之Model模型的介紹與設計


Tip 4. 人性化顯示(humanize)數字或時間

django.contrib.humanize模塊自帶一組模板過濾器, 可將數字或者日期轉化為人類友好可讀的格式,更人性化。比如模板過濾器naturaltime可以將2019-06-24 10:33:24時間顯示為1 day ago。

使用該組模板過濾器時,你需要在INSTALLED_APPS 加入django.contrib.humanize模塊,並在模板裡載入,如下所示。

INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
]

模板裡先載入再使用。

{% load humanize %} 

{{ notification.date|naturaltime }}

其它過濾器作用如下:

過濾器

作用

舉例

apnumber

英文數字

1 => one

intcomma

三位逗號數字

4500000 => 4,500,000

intword

文本數字

4500000 => 4.5 million

naturalday

友好的日期

2018-10-24 => yesterday

naturaltime

友好的時間

2018-10-25 12:00:01 => a minute ago.

ordinal

序數字符串

3 => 3rd

更多模板過濾器見Django基礎(4): 模板(Template)的設計及常用過濾器與標籤介紹

Tip 3. 使用redirect進行跳轉

使用redirect比HttpResponseRedirect跳轉更便捷,尤其在你需要跳轉到某個視圖,還需要給視圖傳遞參數時。如下所示:

from django.shortcuts import redirect
from blog.models import Post

def post_view(request, post_id):
return redirect('post_details', id=post_id)

# equivalent to:

return HttpResponseRedirect(reverse('post_details', args=(post_id, )))

redirect是django提供的便捷函數(shortcut function), 更多內容見Django基礎(27): 快捷函數(shortcut function)模塊詳解.

Tip 2. 使用request在模板中獲取當前url

在模板中你可以使用{{ request.path }}獲取當前url,如果要獲取帶querystring的完整url你可以使用{{ request.get_full_path }}。如果你要獲取完整絕對路徑,你可以使用 {{ request.build_absolute_uri }}。具體使用方法如下所示:

https://jackeygao.io/search/?keyword=django

Method

Output

request.path

/search/

request.get_full_path

search/?keyword=django

request.build_absolute_uri

https://jackeygao.io/search/?keyword=django

Tip 1. 使用F方法更新一個對象或多個對象欄位

通常情況下我們在更新數據時需要先從資料庫裡將原數據取出後放在內存裡,然後編輯某些欄位或屬性,最後提交更新資料庫。使用F方法則可以幫助我們避免將所有數據先載入內存,而是直接生成SQL語句更新資料庫。

假如我們需要對所有產品的價格漲20%,我們通常做法如下。當產品很少的時候,對網站性能沒影響。但如果產品數量非常多,把它們信息全部先載入內存會造成很大性能浪費。

products = Product.objects.all()
for product in products:
product.price *= 1.2
product.save()

使用F方法可以解決上述問題。我們直接可以更新資料庫,而不必將所有產品載入內存。

from django.db.models import F

Product.objects.update(price=F('price') * 1.2)

我們也可以使用F方法更新單個對象的欄位,如下所示:

product = Product.objects.get(pk=5009)
product.price = F('price') * 1.2
product.save()

但值得注意的是當你使用F方法對某個對象欄位進行更新後,需要使用refresh_from_db()方法後才能獲取最新的欄位信息(非常重要!)。如下所示:

product.price = F('price') + 1
product.save()
print(product.price) # <CombinedExpression: F(price) + Value(1)>
product.refresh_from_db()
print(product.price) # Decimal('13.00')

小結

本文搬運來Django的5個常用小技巧,包括使用auto_now_add和auto_now選項設置時間欄位,使用humanize人性化顯示時間和數字,使用redirect進行跳轉,使用request.get_full_path等方法在模板中獲取當前連結及使用F方法更新對象欄位,希望對大家有幫助哦。

大江狗

2019.6.25

相關焦點

  • 鋼琴怎麼搬運?鋼琴搬運的小技巧與你分享
    鋼琴怎麼搬運?鋼琴搬運的小技巧與你分享時間:2020-12-18 17:50   來源:今日頭條   責任編輯:沫朵 川北在線核心提示:原標題:鋼琴怎麼搬運?鋼琴搬運的小技巧與你分享 鋼琴怎麼搬運 小編為大家解答鋼琴怎麼搬運,接下來就是全面介紹。
  • django-admin和manage.py用法
    記錄要點:django-admin和manage.py 能做同樣的事情 像我們常用的python manage.py runserver,用django-admin也可以操作:django-admim runserver 注意: django-admin需要提前提前配置好DJANGO_SETTINGS_MODULE環境變量
  • 8個能提高Django開發效率的Python包
    這裡介紹了六個Django應用程式包和兩個Django的REST框架包,當我們說這些包幾乎出現在我們工作的每個項目中時,一點也沒有誇張。但是在此之前,你可以先看看我們之前寫的有關如何讓Django 管理更加安全的技巧,以及一篇關於5個最喜歡的開源Django包的文章。
  • 江工大人物 這是一位「大哥哥」
    新的一周又和大家見面了又到了一周一期的江工大人物咯本期大人物是院學生會紀檢部的部長劉康學長在本期的「江工大人物」的留言板上寫下他的大名並附加你推薦他的原因和他的班級或者聯繫方式(如小明,江工呼嚕聲最響,**班級or 137.電話)說不定,你心目中的他就是下一期的「江工大人物」哦!
  • 冰箱搬運注意事項 搬運冰箱的技巧有哪些
    搬家一直都是讓什麼非常頭痛的問題,大家在了解搬運冰箱的時候,就會發現搬家有很多的困擾,尤其是在搬運一些家電的時候,更是需要一些技巧的。冰箱的搬運其實就給很多不懂的人帶來了苦惱,大家希望尋找到更合適的方法,使搬運工作可以更順利的進行。那麼冰箱搬運注意事項和搬運冰箱的技巧有哪些?
  • Django實現分頁功能
    Paginator 可以叫它為分頁器,實際上它也是一個 Python 類,要使用它的時候我們可以用如下方式進行引入:from django.core.paginator import Paginator這個類被定義在 django.core.paginator 模塊中,它的構造函數如下所示:class Paginator
  • Django分頁完整示例
    在django中可以使用兩種方法進行分頁,第一種方法是使用基於函數的視圖,第二種方法是使用基於類的視圖。現在,首先,需要使用此命令創建一個新的django項目。我稱這個項目為MyProjectdjango-admin startproject ProjectName首先,需要將目錄更改為已創建的項目,然後需要創建一個App,我將其稱為MyApp。
  • Python+django網頁設計入門(12):使用Bootstrap和jQuery
    前導課程:Python+django網頁設計入門(11):在線考試與自動評分Python+django網頁設計入門(10):分頁顯示Python+django網頁設計入門(9):自定義反爬蟲功能Python+django網頁設計入門(8):網站項目文件夾布局Python+django網頁設計入門
  • Django第二十八課
    這裡大概有兩種方法:一是繼承django的用戶模型;二是使用新的模型拓展關聯User(🌟🌟🌟🌟🌟)。1. 繼承Django的用戶模型我們之前使用的User是在django.contrib.auth.models中引用的,我們可以查看這部分源碼,分析這個User是如何創建的。
  • Django聚合查詢和分組查詢
    不帶分組的聚合查詢是指對將全部數據進行集中統計查詢,Django 定義了一些常用的聚合函數,比如求平均值(Avg)、計數(Count)、求最值(Max和Min)以 Sum 求和。它們統一定義在 django.db.models模塊中,所以再使用聚合函數時,同樣需要提前導入,為了方便使用,我們採用下面的方式引入:from django.db.models import *它的語法格式如下所示,它的返回值是一個字典,以統計結果變量名為 key,以統計值為 value:MyModel.objects.aggregate(統計結果變量名
  • Django Form表單API詳解
    Django 表單系統功能非常強大,它可以實現對欄位的驗證,而且還可以根據欄位定義生成 HTML,在本節我們通過一些 Form 表單的 API,對上述功能進行詳細的講解,通過本節知識的學習,你會對 Django 表單系統有更加深入的認識,在本節中我們會穿插介紹一些小的應用實例以便於讀者更好的理解這些
  • 一個完整的Django入門指南
    想知道更多的示例,你可以到Django Sites資料庫中查看,它提供超過五千個Django驅動的網站列表。順便說一下,去年在Django 2016年發布會上,Django核心開發人員,Instagram員工 carl meyer,就Instagram如何大規模使用Django以及它如何支持他們的用戶增長做過一次分享。這是個一小時的演講,如果你有興趣學習了解更多的話,這是一次很有趣的演講。
  • Django 1.5.2/1.4.6 發布 - OSCHINA - 中文開源技術交流社區
    2013-08-14 上個版本是2013-03-28的1.5.1,需要Python 2.6.5以上版本,也支持了Python 3.修復1.5 版本中的一些問題。主要是修復2個XSS的安全漏洞。開發版1.6B2發布聲明:Django 1.5.2 release notesAugust 13, 2013This is Django 1.5.2, a bugfix and security release for Django 1.5.
  • 最淺顯易懂的Django系列教程(1)-URL與視圖
    >在urls.py文件中把所有的和book這個app相關的url都移動到app/urls.py中了,然後在first_project/urls.py中,通過include函數包含book.urls,以後在請求book相關的url的時候都需要加一個book的前綴。
  • Django第十八課
    from django.shortcuts import renderfrom django.contrib.contenttypes.models import ContentTypefrom read_count.utils import get_seven_days_read_data, get_today_hot_data
  • 江工大人物厲害了「x-two」負責人朱芳翥
    新的一周又和大家見面了又到了一周一期的江工大人物咯本期大人物是「x-two」負責人朱芳翥學長在本期的「江工大人物」的留言板上寫下他的大名並附加你推薦他的原因和他的班級或者聯繫方式(如小明,江工呼嚕聲最響,**班級or 137.電話)說不定,你心目中的他就是下一期的「江工大人物」哦!
  • Django 1.10中文文檔-聚合
    >>>> pubs[0].num_books73# The top 5 publishers, in order by number of books.第二個查詢先計算每個 publisher 中 rating 的值超過 3.0 的圖書。篩選器先於注釋,因此篩選器在計算注釋時已經約束了對象。
  • Python——用 Django 寫 restful api 接口
    'img_url']))                  db.commit()                  print(i[0] + " is success")              except:                  db.rollback()      db.close()  # 關閉資料庫5、
  • 用Python加Django十分鐘建個網站
    而Django 是老牌基於Python的CMS框架了,一直聽說很強大,甚至曾經很紅的Ruby On Rails都參考了它的很多概念,今天我們就簡單學習一個首先當然要pip install django然後我們就可以新建一個目錄,在這個目錄下執行django-admin startproject HelloWorld它會創建HelloWord
  • 10道題教你使用python Django框架來實現web應用,值得收藏
    關於django升級:django1.5開始支持python3。同時django1.11是支持python2的最後的版本。如果使用的django版本大於等於1.5,則django版本可以不升級。如果django版本低於1.5,則需要升級django版本。升級django版本後,新版本不兼容的老的API都需要修改。這個工作量比較大。