Django 2.2 新特性清單

原文檔地址:docs.djangoproject.com/en/2.2/rele…html

最主要feature:Model Conatrains

能夠在 model 的 Meta 中定義一個 constrains 列表。好比下面這個例子,添加了一個age字段數據必須大於等於18的限制。數據庫

注意:不能在 AbstractModel 類裏面定義constrains,由於每一個 constrain都必需要有一個惟一的名字。若是在AbstractModel中定義的話,勢必會重複。django

from django.db import models

class Customer(models.Model):
    age = models.IntegerField()

    class Meta:
        constraints = [
            models.CheckConstraint(check=models.Q(age__gte=18), name='age_gte_18'),
        ]
複製代碼

知識點回顧:models.Q 查詢

models.Q 能夠用來組合產生複雜的查詢語句,好比 OR 查詢:bash

queryset = User.objects.filter(
    Q(first_name__startswith='R') | Q(last_name__startswith='D')
)
複製代碼

AND 查詢:post

queryset = User.objects.filter(
    Q(first_name__startswith='R') & Q(last_name__startswith='D')
)
複製代碼

first_name‘R’開頭, 可是 last_name 不以Z開頭:測試

queryset = User.objects.filter(
    Q(first_name__startswith='R') & ~Q(last_name__startswith='Z')
)
複製代碼

詳情情見:優化

class CheckConstraint

check

必填參數。spa

須要傳入一個Q 對象,代表你須要怎樣的 constrain 要求,好比CheckConstraint(check=Q(age__gte=18), name='age_gte_18')確保age字段用於不會小於18.命令行

name

必填參數。必須是惟一的。日誌

class UniqueConstraint

fields

對哪些 fields 作惟一限制。好比UniqueConstraint(fields=['room', 'date'], name='unique_booking')確保每一個 room 一天只能被預訂一次。

name

同上,必須是惟一的。

condition

知足什麼條件時纔要求強制 constrain 條件。

測試用例:

model 相關

automatic transaction的變化

2.2發佈日誌裏面一個不起眼的地方寫了這樣一句:

Django no longer always starts a transaction when a single query is being performed, such as Model.save(), QuerySet.update(), and Model.delete(). This improves the performance of autocommit by reducing the number of database round trips.

也就是說 django 再也不和以前同樣,每一個 query(好比 save,update,delete) 都會開啓一個 transaction。這樣能夠經過減小 django <-> 數據庫往返次數來提升效率。

Index.condition

文檔

考慮到這樣的應用場景:table 很大,可是 query 只會查詢一小部分的數據。爲全部數據項都建一個索引是不必的,這時候就能夠針對某一部分特定數據創建索引。

好比下面這個例子:

indexes = [
    models.Index(
        fields=['username'],
        condition=models.Q(age__gte=30),
        name='idx_username_age_gte30'
    )
]
複製代碼

將只會爲年齡大於30歲的用戶在username這個字段上創建索引。

Index.condition 底層支持依賴於數據庫的partial indexes。 而MySQL、MariaDB、Oracle都不支持partial indexes,因此這些數據庫會直接忽略掉。

bulk_create

增長了一個ignore_conflicts參數,設置爲 TRUE 的時候告訴數據庫忽略因爲 constrain 產生的錯誤。

bulk_update

bulk_update(objs, fields, batch_size=None)

須要 update 大量數據的時候頗有用。

>>> objs = [
...    Entry.objects.create(headline='Entry 1'),
...    Entry.objects.create(headline='Entry 2'),
... ]
>>> objs[0].headline = 'This is entry 1'
>>> objs[1].headline = 'This is entry 2'
>>> Entry.objects.bulk_update(objs, ['headline'])
複製代碼

這樣會比使用一個 for 循環一個一個調用update()方法速度更快。

有幾點須要注意:

  • save()方法不會被調用,因此post_savepre_save信號將不會觸發。
  • 若是數據量很大,能夠指定batch_szie 參數

migrations

新增了一個--plan命令行參數,用來查看 django 將要執行什麼數據庫修改操做。

針對 PG 數據庫的優化

django.contrib.postgres

  • ordering參數增長了ArrayAggStringAgg。能夠針對 aggv 數據來作排序。
  • 新增的BTreeIndex, HashIndexSpGistIndex 類容許建立 B-Tree, hash, and SP-GiST 索引。
  • BrinIndex如今有了一個autosummarize參數。
  • SearchQuerysearch_type作了些變化。

HttpRequest

新增了HttpRequest.headers,以便更方便地獲取請求頭信息。

>>> request.headers
{'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...}

>>> 'User-Agent' in request.headers
True
>>> 'user-agent' in request.headers
True

>>> request.headers['User-Agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers['user-agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)

>>> request.headers.get('User-Agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers.get('user-agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
複製代碼

以前須要經過 request.META獲取,相對要麻煩了不少。在2.2以前的版本,若是你想要獲取全部的 HTTP 請求頭的話,能夠這麼獲取:

import re
regex = re.compile('^HTTP_')
dict((regex.sub('', header), value) for (header, value) 
       in request.META.items() if header.startswith('HTTP_'))
複製代碼

其餘特性

其餘瑣碎的東西還有不少,好比:

  • collectstatic --ignore PATTERN選項,忽略指定模式的靜態資源。
  • inspectdb有了更豐富的功能。
  • Tests 新功能。

詳細的,仍是去看官方的文檔吧。此外還提到了一些往前不兼容的改變,若是你的項目裏面用到了,也須要注意注意。

個人公衆號:全棧不存在的

相關文章
相關標籤/搜索