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_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)的欄位型別解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!