5个必读常用Django小技巧

本文介绍了5个Django开发中非常实用的小技巧:1) 利用auto_now_add和auto_now选项自动管理DateTimeField;2) 使用humanize模板过滤器使数字和时间更人性化;3) 通过redirect简化视图间的跳转;4) 在模板中用request获取当前URL;5) 使用F表达式高效更新对象字段。这些技巧能提高Django项目的开发效率和代码质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果你初学Django且英语不错,相信你大概率上过simpleisbetterthancomplex.com这个网站。作者生活在芬兰,写过很多关于Django技巧的原创英文文章。今天小编我就借花献佛,用中文辛苦搬运来5个我认为非常有用的Django小技巧,与大家分享。

Tip 5. 创建DateTimeField字段时使用auto_now_add和auto_now选项

当你在给一个模型创建一个DateTimeField类型的字段时,你可以设置auto_now_add=Trueauto_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 }}

其它过滤器作用如下:

过滤器

作用

举例

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值