1. 程式人生 > >Django2.0-db(3)-模型常用欄位, navie和aware時間

Django2.0-db(3)-模型常用欄位, navie和aware時間

模型常用欄位

常用欄位

Django中,定義了一些Field來與資料庫表中的欄位型別來進行對映。

AutoField

對映到資料庫中的是int型別,可以有自動增長的特性。

如果不指定主鍵,模型會自動生成一個叫做 id的自動增長模型。

field可以指定名字

BigAutoField

64位的整型,對應資料庫的 bigInt,類似 AutoField ,不過產生的資料的範圍是從 1~9223372036854775807

BooleanField

在模型層面接收 True或者 False。對應資料庫的 tinyint. 如果沒有指定預設值,預設值是 None

預設null=False

NullBooleaField

如果要指定null=True,使用NullBooleanField代替。

CharField

對應資料庫的 varchar。 在python層面是普通的字串

必須指定最大的長度(max_length)

如果超過254個字元,不建議使用,而是使用TextFile

DateField

日期型別。python中的datetime。 對應資料庫的date

可以傳遞以下幾個引數:

  1. auto_now :在每次這個資料儲存(save())的時候,都使用當前的時間。型別為True or False可用於記錄修改日期。
  2. auto_now_add :在每次資料第一次被新增進去的時候,都使用當前的時間。型別為True
    or False。可用於記錄第一次入庫的時間。

DateTimeField

日期時間型別。可以儲存日期和時間。對應資料庫中的datetime型別。

同樣也有auto_nowauto_now_add屬性

TimeField

時間型別。對應資料庫的time。在python中是datetime.time型別

EmailField

  • 類似於CharField.在資料庫底層也是一個varchar型別。預設長度是254個字元。
    • 在資料庫層面無限制。但是在ModelForm等表單相關操作的時候會起作用

FiledField

  • 用來儲存檔案的

ImageField

  • 用來儲存圖片檔案的。

FloatFiled

  • 浮點型別。對應資料庫的float

IntegerField

  • 整型。區間是(-231) ~ 232 -1

BigIntegerField

  • 大整型。區間是 (-263) ~ 263 -1

PositiveIntegerField

  • 正整型。區間是 0 ~ 263 -1

SmallIntegerField

  • 小整型。區間是 (-215) ~ 215 -1

PositiveSmallIntegerField

  • 正小整型。區間是 0 ~ 215 -1

TextField

  • 大量的文字型別。 對應資料庫的longtext

UUIDField

  • 只能儲存uuid格式的字串。uuid是一個32位的全球唯一的字串。一般用來作為主鍵。

URLField

  • 類似Charfield,只能用於儲存url格式的字串。預設的max_length為200

navie時間和aware時間

  1. navie時間: 幼稚。不知道自己的時間表示的是哪個時區。
  2. aware時間:清醒的。知道自己的時間表示的是哪個時區。
pytz庫:
  • 專門用來處理時區的庫。這個庫會經常更新一些時區的資料。安裝Django預設安裝。
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 navie datetime
        # 丟擲一個異常。navie型別的時間不能呼叫astimezone方法
    now = now.replace(tzinfo=pytz.timezone('Asia/Shanghai'))  # 修改屬性,變成一個aware時間型別
    utc_now = now.astimezone(utc_timezone)
    # 就可以正確呼叫astimezone()
    
replace方法
  • 可以將一個時間的某些屬性進行更改
django.utils.timezone.now
  • settings.py中,如果USE_TZ = True,則now()返回aware型別的UTC時間.如果沒有設定,則返回navie型別的時間。

    from django.utils.timezone import now # 要用到話這樣import即可
    
    now()
    
django.utils.timezone.localtime
  • 根據setting.py中的TIME_ZONE來將一個aware型別的時間轉換為TIME_ZONE指定時區的時間。

    from django.utils.timezone import localtime # 要用到話這樣import即可
    
    target_time = localtime(aware_time)