
如果你初學Django且英語不錯,相信你大機率上過http://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)
-
在建立的時候自動設定字段為auto_now_add
timezone.now()
-
在每次調用auto_now
方法都會更新為目前時間save
建立模型各個字段時的注意事項見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 }}
更多模闆過濾器見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.08