1. 程式人生 > 程式設計 >django資料模型(Model)的欄位型別解析

django資料模型(Model)的欄位型別解析

欄位型別(Field types)

1、AutoField

它是一個根據 ID 自增長的 IntegerField 欄位。通常,你不必直接使用該欄位。如果你沒在別的欄位上指定主 鍵,Django 就會自動新增主鍵欄位。

2、BigIntegerField

64位整數,類似於IntegerField,範圍從-9223372036854775808 到9223372036854775807。預設的form widget 是TextInput。

3、BooleanField

一個布林值(true/false)欄位。
預設的form widget是CheckboxInput。
如果要使用null作為空值,可使用NullBooleanField。

4、CharField

class CharField(max_length=None[,**options])
它是一個字串欄位,對小字串和大字串都適用。
對於更大的文字,應該使用TextField 。
預設的form widget是TextInput。
CharField 有一個必須傳入的引數:max_length,欄位的最大字元數。它作用於資料庫層級和 Django 的資料驗證層級。

5、DateField

class DateField([auto_now=False,auto_now_add=False,**options])
該欄位利用 Python 的 datetime.date 例項來表示日期。下面是它額外的可選引數:

DateField.auto_now:每一次儲存物件時,Django 都會自動將該欄位的值設定為當前時間。一般用來表示 "最後修改" 時間。要注意使用的是當前日期,而並非預設值,所以
不能通過重寫預設值的辦法來改變儲存時間。
DateField.auto_now_add:在第一次建立物件時,Django 自動將該欄位的值設定為當前時間,一般用來表示物件建立時間。它使用的同樣是當前日期,而非預設值。
預設的form widget是TextInput。
Note:當auto_now或者auto_now_add設定為True時,欄位會有editable=True和blank=True的設定。

6、DateTimeField

class DateTimeField([auto_now=False,**options])
該欄位利用 datetime.datetime 例項表示日期和時間。該欄位所按受的引數和 DateField 一樣。
預設的form widget是TextInput。Django 的admin使用兩個帶有 JavaScript 快捷選項TextInput分別表示日期和時間。

7、DecimalField

class DecimalField(max_digits=None,decimal_places=None[,**options])
它是使用 Decimal 例項表示固定精度的十進位制數的欄位。它有兩個必須的引數:
DecimalField.max_digits:數字允許的最大位數
DecimalField.decimal_places:小數的最大位數
例如,要儲存的數字最大值是999,而帶有兩個小數位,你可以使用:

models.DecimalField(...,max_digits=5,decimal_places=2)
要儲存大約是十億級且帶有10個小數位的數字,就這樣寫:
models.DecimalField(...,max_digits=19,decimal_places=10)

8、EmailField

class EmailField([max_length=75,**options])
它是帶有 email 合法性檢測的A CharField 。
Note:最大長度預設為75,並不能儲存所有與RFC3696/5321相容的email地址。如果要儲存所有,請設定
max_length=254。設定為75是歷史遺留問題。

9、TextField

class TextField([**options])
大文字欄位。預設的form widget是Textarea。

ps:下面看下django資料模型on_delete,db_constraint的使用

# 半夜擼程式碼 正在一頓操作猛如虎的時候,發現刪了其中一張表的某條記錄,結果發現其他表跟這個欄位的關聯的也都被刪除,我已經寫了db_constraint=False 難道我用錯了,最後只能查資料,原來想斷關聯還想連表查詢做這個是不夠的,還需要null=True,blank=True,on_delete=models.SET_NUL這裡我之前寫的是on_delete=models.CASCADE 預設級聯刪除,坑了自己一把,還有昨天晚上也是,後臺寫好,萬事具備的時候,準備開擼前臺,ajax請求就是不通,各種改地址 埠,最後居然是配置裡'corsheaders.middleware.CorsMiddleware'這個沒加,唉,擼個程式碼配環境還要配幾個小時?

1.設定為null

class BookModel(models.Model):
 """
 圖書
 """
 book_name = models.CharField(max_length=100,verbose_name='書名')
 # 表示外來鍵關聯到作者表,當作者表刪除了該條資料,圖書表中不刪除,僅僅是把外來鍵置空
 author = models.ForeignKey(AuthModel,null=True,on_delete=models.SET_NULL)
 price = models.FloatField(verbose_name='價格')
 create_time = models.DateTimeField(auto_now_add=True,verbose_name='新增時間')

2.建表時其他引數的設定

CASCADE:這就是預設的選項,級聯刪除,你無需顯性指定它。
PROTECT: 保護模式,如果採用該選項,刪除的時候,會丟擲ProtectedError錯誤。
SET_NULL: 置空模式,刪除的時候,外來鍵欄位被設定為空,前提就是blank=True,定義該欄位的時候,允許為空。
SET_DEFAULT: 置預設值,刪除的時候,外來鍵欄位設定為預設值,所以定義外來鍵的時候注意加上一個預設值。
SET(): 自定義一個值,該值當然只能是對應的實體了

3.set的使用

def get_sentinel_user():
 return get_user_model().objects.get_or_create(username='deleted')[0]

class MyModel(models.Model):
 user = models.ForeignKey(
  settings.AUTH_USER_MODEL,on_delete=models.SET(get_sentinel_user),)

4.ManyToMany引數(through,db_constraint)

class Book(models.Model):
 name=models.CharField(max_length=20)
 authors=models.ManyToMany('Author',through='Score')
class Author(models.Model):
 name=models.CharField(max_length=20)
class Score(models.Model):
 book=models.ForeignKey('Book')
 author=models.ForeignKey('Author')
 socre=models.IntegerField()
#######

如果只寫manytomany,那麼第三張是Django替我們建的,可以通過book.authors欄位進行一系列操作(add(增),all(查),set(重置),remove(刪除)),但是此時沒法給第三張表加其他我們需要的欄位,

而如果不寫,ManyToMany欄位,那麼我們可以通過Score來執行一些操作,但是此時book和author表已經沒有直接的聯絡了,查詢起來很繁瑣

有了authors=models.ManyToMany('Author',through='Score'),那麼就既可以方便查,也方便業務,新增需要的欄位

5.db_constraint

db_constraint=False,這個就是保留跨表查詢的便利(雙下劃線跨表查詢```),但是不用約束欄位了,一般公司都用false,這樣就省的報錯,因為沒有了約束(Field欄位物件,既約束,又建立表與表之間的關係)
limit_choices_to
限制關聯欄位的物件範圍
related_name
反向查詢欄位可以不用 表名小寫,可以改名了
db_table
第三張表的名字
 models.ForeignKey(AuthModel,on_delete=models.SET_NULL,db_constraint=False)

5.總結

如果使用兩個表之間存在關聯,首先db_constraint=False 把關聯切斷,但保留連表查詢的功能,其次要設定null=True,

總結

以上所述是小編給大家介紹的django資料模型(Model)的欄位型別解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!