Django 3 版本系列的 LTS(長期支持版本)立刻就要在 4 月份發佈,這個版本將會陪伴咱們兩年之久。在新版本發佈前夕來提早了解下有哪些有趣的新功能,這些功能在發佈時應該不會變更了。css
截止到 3 月 9 日,已發佈Django beta2版本。Django 3.2 僅支持 Python3.六、3.七、3.8 和 3.9,安裝時注意 Python 版本。html
一、建立虛擬環境python
$ mkdir django3
$ cd django3
$ python3.6 -m venv venv
$ source venv/bin/activate
複製代碼
二、安裝 django3.2 b1mysql
(venv) $ pip install git+https://github.com/django/django@3.2b1
複製代碼
三、建立新的項目和 app ,防止你本地環境影響,這裏直接使用虛擬環境中的命令來建立git
(venv) $ venv/bin/django-admin startproject django3
(venv) $ cd django3
(venv) $ python manage.py startapp blog
複製代碼
四、將 app 添加到 settings。github
# settings.py
INSTALLED_APPS = [
# ...
'blog',
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django3',
'USER': 'root',
'PASSWORD': 'Root1024',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
複製代碼
五、建立 model 用來測試:sql
from django.db import models
class Blog(models.Model):
title = models.CharField(max_length=1000)
create_at = models.DateTimeField()
複製代碼
六、生成數據表:數據庫
(venv) $ python manage.py makemigrations
(venv) $ python manage.py migrate
複製代碼
七、隨便構造點數據:express
import string
import datetime
import random
import pytz
import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(os.path.join(BASE_DIR, '..'))
os.environ['DJANGO_SETTINGS_MODULE'] = 'django3.settings'
import django
django.setup()
from blog.models import Blog
starting_at = pytz.UTC.localize(datetime.datetime(2020, 1, 1))
DAY = datetime.timedelta(days=1)
Blog.objects.bulk_create((Blog(
title=''.join(random.choices(string.ascii_letters + ' ' * 10, k=random.randint(10, 20))),
create_at=starting_at + (DAY * random.random() * 365),
) for _ in range(10000)))
複製代碼
好了,如今咱們有 Django3.2 的環境了,下面開始搞起。django
在以前的版本中,當模型中沒有定義主鍵時,django 會自動增長一個類型爲 AutoField 的字段 id做爲主鍵,它是 IntegerField 的子類,範圍爲-2147483648 to 2147483647 。
在 Django 3.2 版本中,自增主鍵的類型替換爲 BigAutoField 範圍爲 1 to 9223372036854775807。除此以外,在settings
配置中顯式的增長了 DEFAULT_AUTO_FIELD
變量。若你不想修改源數據庫的字段類型話,在升級時,在settings
中最好顯式的添加以下配置:
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
複製代碼
在自定義 admin 模型展現字段的時候,以前是在所需字段直接賦值,如今使用 display 使代碼變得更優雅。
# docs see https://docs.djangoproject.com/en/dev/releases/3.2/#new-decorators-for-the-admin-site
from django.contrib import admin
from .models import Blog
@admin.register(Blog)
class BlogAdmin(admin.ModelAdmin):
list_display = (
'id',
'create_at',
'create_at_year',
'title',
)
# 老的實現方式
# def create_at_year(self, obj: Blog) -> str:
# return obj.create_at.year
# create_at_year.admin_order_field = 'create_at__year'
# create_at_year.short_description = 'Year created'
@admin.display(ordering='create_at__year', description='Year created')
def create_at_year(self, obj: Blog) -> str:
return obj.create_at.year
複製代碼
admin 的樣式顏色採用了 css 變量來定義,咱們能夠直接從新 base.html 模板,在其中定義 css變量便可,不用再去從新覆蓋具體的css文件。官網的例子:
{% extends 'admin/base.html' %}
{% block extrahead %}{{ block.super }}
<style>
:root {
--primary: #9774d5;
--secondary: #785cab;
--link-fg: #7c449b;
--link-selected-fg: #8f5bb2;
}
</style>
{% endblock %}
複製代碼
咱們會看到以下的 admin 頁面。
咱們可使用JSONOject
功能函數實現自定義 json 字段的功能,以下 blog對象實例多了一個json格式的json_obj字段:
>>> from django.db.models.functions import JSONObject, Lower, TruncDay
>>> import pytz
>>> Blog.objects.annotate(json_obj=JSONObject(title=Lower('title'), creat_year=TruncDay('create_at', tzinfo=pytz.UTC)))
>>> blog = Blog.objects.annotate(json_obj=JSONObject(title=Lower('title'), creat_year=TruncDay('create_at', tzinfo=pytz.UTC))).first()
>>> blog.json_obj
{'title': 'zjy dqaiab ', 'creat_year': '2020-02-12 00:00:00.000000'}
複製代碼
Django3.2 分頁器 Paginator
對象增長了get_elided_page_range
方法 ,它相似page_range
,輸出的是頁數區間的生成器,會根據配置將中間頁數用省略號代替。該方法有兩個參數on_each_side
和on_ends
,省略號前邊顯示頁數個數爲on_each_side
+1,省略號後邊頁數個數爲on_ends
。之後咱們在寫分頁的時候,不再用本身處理了,期待。
>>> from django.core.paginator import Paginator
>>> page_obj = Paginator(blogs, page_size)
>>> page_obj.get_elided_page_range(on_each_side=3, on_ends=2)
<generator object Paginator.get_elided_page_range at 0x10fb2f620>
>>> list(page_obj.get_elided_page_range(on_each_side=3, on_ends=2))
[1, 2, 3, 4, '…', 999, 1000]
複製代碼
QuerySet.select_for_update()
查詢鎖的實現,目前支持不是很好,須要的數據庫版本都比較高。「Currently, the postgresql, oracle, and mysql database backends support select_for_update(). However, MariaDB 10.3+ supports only the nowait argument and MySQL 8.0.1+ supports the nowait, skip_locked, and of arguments. The no_key argument is supported only on PostgreSQL.」期待後續更新吧。總的來講 Django3.2 並無大的更新,延續了 3.1 的不少功能,對 Model 性能和實用性方面作了很多優化,針對 postgreSQL 偏多,有些功能要求 mysql 版本都在 8.0 以上。期待的異步功能並無更新,看來「異步 Django」的願望實現還須要時間。
上邊完整代碼可從github獲取,地址爲 github.com/pylixm/djan…
好了,今天的分享就到這裏吧,歡迎留言討論你覺着超讚的Django新功能~
我是DeanWu,一個努力成爲真正SRE的人。
關注公衆號「碼農吳先生」, 可第一時間獲取最新文章。回覆關鍵字「go」「python」獲取我收集的學習資料,也可回覆關鍵字「小二」,加我wx拉你進技術交流羣,聊技術聊人生~