django開發系列:ORM常用Field
navie時間和aware時間:
什麼是navie時間?什麼是aware時間?
- navie時間:不知道自己的時間表示的是哪個時區的。也就是不知道自己幾斤幾兩。比較幼稚。
- aware時間:知道自己的時間表示的是哪個時區的。也就是比較清醒。
pytz庫:
專門用來處理時區的庫。這個庫會經常更新一些時區的數據,不需要我們擔心。並且這個庫在安裝Django的時候會默認的安裝。如果沒有安裝,那麼可以通過pip install pytz
的方式進行安裝。
astimezone方法:
將一個時區的時間轉換爲另外一個時區的時間。這個方法只能被aware
類型的時間調用。不能被navie
類型的時間調用。
示例代碼如下:
import pytz
from datetime import datetime
now = datetime.now() # 這是一個navie類型的時間
utc_timezone = pytz.timezone("UTC") # 定義UTC的時區對象
utc_now = now.astimezone(utc_timezone) # 將當前的時間轉換爲UTC時區的時間
>> ValueError: astimezone() cannot be applied to a naive datetime # 會拋出一個異常,原因就是因爲navie類型的時間不能調用astimezone方法
now = now.replace(tzinfo=pytz.timezone('Asia/Shanghai'))
utc_now = now.astimezone(utc_timezone)
# 這時候就可以正確的轉換。
replace方法:
可以將一個時間的某些屬性進行更改。
django.utils.timezone.now方法:
會根據settings.py
中是否設置了USE_TZ=True
獲取當前的時間。如果設置了,那麼就獲取一個aware
類型的UTC
時間。如果沒有設置,那麼就會獲取一個navie
類型的時間。
django.utils.timezone.localtime方法:
會根據setting.py
中的TIME_ZONE
來將一個aware
類型的時間轉換爲TIME_ZONE
指定時區的時間。
DateField:
日期類型。在Python
中是datetime.date
類型,可以記錄年月日。在映射到數據庫中也是date
類型。使用這個Field
可以傳遞以下幾個參數:
auto_now
:在每次這個數據保存的時候,都使用當前的時間。比如作爲一個記錄修改日期的字段,可以將這個屬性設置爲True
。auto_now_add
:在每次數據第一次被添加進去的時候,都使用當前的時間。比如作爲一個記錄第一次入庫的字段,可以將這個屬性設置爲True
。
DateTimeField:
日期時間類型,類似於DateField
。不僅僅可以存儲日期,還可以存儲時間。映射到數據庫中是datetime
類型。這個Field
也可以使用auto_now
和auto_now_add
兩個屬性。
TimeField:
時間類型。在數據庫中是time
類型。在Python
中是datetime.time
類型。
navie和aware介紹以及在django中的用法:
https://docs.djangoproject.com/en/2.0/topics/i18n/timezones/
EmailField:
類似於CharField
。在數據庫底層也是一個varchar
類型。最大長度是254個字符。
FileField:
用來存儲文件的。這個請參考後面的文件上傳章節部分。
ImageField:
用來存儲圖片文件的。這個請參考後面的圖片上傳章節部分。
FloatField:
浮點類型。映射到數據庫中是float
類型。
IntegerField:
整形。值的區間是-2147483648——2147483647
。
BigIntegerField:
大整形。值的區間是-9223372036854775808——9223372036854775807
。
PositiveIntegerField:
正整形。值的區間是0——2147483647
。
SmallIntegerField:
小整形。值的區間是-32768——32767
。
PositiveSmallIntegerField:
正小整形。值的區間是0——32767
。
TextField:
大量的文本類型。映射到數據庫中是longtext類型。
UUIDField:
只能存儲uuid
格式的字符串。uuid
是一個32位的全球唯一的字符串,一般用來作爲主鍵。
URLField:
類似於CharField
,只不過只能用來存儲url
格式的字符串。並且默認的max_length
是200。
Field常用的參數
null:
如果設置爲True
,Django
將會在映射表的時候指定是否爲空。默認是爲False
。在使用字符串相關的Field
(CharField/TextField)的時候,官方推薦儘量不要使用這個參數,也就是保持默認值False
。因爲Django
在處理字符串相關的Field
的時候,即使這個Field
的null=False
,如果你沒有給這個Field
傳遞任何值,那麼Django
也會使用一個空的字符串""
來作爲默認值存儲進去。因此如果再使用null=True
,Django
會產生兩種空值的情形(NULL或者空字符串)。如果想要在表單驗證的時候允許這個字符串爲空,那麼建議使用blank=True
。如果你的Field
是BooleanField
,那麼對應的可空的字段則爲NullBooleanField
。
blank:
標識這個字段在表單驗證的時候是否可以爲空。默認是False
。
這個和null
是有區別的,null
是一個純數據庫級別的。而blank
是表單驗證級別的。
db_column:
這個字段在數據庫中的名字。如果沒有設置這個參數,那麼將會使用模型中屬性的名字。
default:
默認值。可以爲一個值,或者是一個函數,但是不支持lambda
表達式。並且不支持列表/字典/集合等可變的數據結構。
primary_key:
是否爲主鍵。默認是False
。
unique:
在表中這個字段的值是否唯一。一般是設置手機號碼/郵箱等。
更多Field
參數請參考官方文檔:https://docs.djangoproject.com/zh-hans/2.0/ref/models/fields/
模型中Meta
配置:
對於一些模型級別的配置。我們可以在模型中定義一個類,叫做Meta
。然後在這個類中添加一些類屬性來控制模型的作用。比如我們想要在數據庫映射的時候使用自己指定的表名,而不是使用模型的名稱。那麼我們可以在Meta
類中添加一個db_table
的屬性。示例代碼如下:
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,name='description',db_column="description1")
class Meta:
db_table = 'book_model'
以下將對Meta
類中的一些常用配置進行解釋。
db_table:
這個模型映射到數據庫中的表名。如果沒有指定這個參數,那麼在映射的時候將會使用模型名來作爲默認的表名。
ordering:
設置在提取數據的排序方式。後面章節會講到如何查找數據。比如我想在查找數據的時候根據添加的時間排序,那麼示例代碼如下:
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,name='description',db_column="description1")
pub_date = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'book_model'
ordering = ['pub_date']
更多的配置後面會慢慢介紹到。
官方文檔:https://docs.djangoproject.com/en/2.0/ref/models/options/