django中模型詳解-字段類型與約束條件

這片博文來詳細說明django模型的使用,涉及到django模型的建立,字段介紹,以及django模型的crud操做,以及一對一等操做。前端

在使用模型以前,咱們首先設置數據庫選項,django的默認數據庫時sqlite3,這裏咱們設置數據庫引擎爲mysql。python

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': "webinfo", 'USER': "root", "PASSWORD": "123456", "PORT": 3306, "HOST": "10.0.102.222", } }

#這裏的參數也就是鏈接數據庫須要的參數,其中name表示的是鏈接到數據庫的哪一個庫。須要注意的是除了使用django默認引擎外,其他的引擎都須要在對應的數據庫上建立對應的數據庫。

#MySQL建立對應的數據庫語句以下!
MariaDB [mytest]> create database webinfo character set utf8;
Query OK, 1 row affected (0.01 sec)

django模型中的字段類型

熟悉MySQL數據庫的話就會知道字段類型的含義,一樣django中也爲各類各樣的信息設置了字段,選擇合適的字段對數據的正確存儲相當重要,這裏會詳細說明django中的字段類型。mysql

首先來看一下官方文檔的一個實例:在models.py中,咱們寫入了以下代碼,這個代碼建立了一個Person類,定義了兩個類屬性。git

class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40)

執行以下操做:web

E:\pycharm\web\testmodel>python2 manage.py makemigrations Migrations for 'mysite': mysite\migrations\0001_initial.py: - Create model Person #建立了模塊Person E:\pycharm\web\testmodel>python2 manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, mysite, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying mysite.0001_initial... OK
命令的結果是在數據庫中建立了對應的表

在數據庫中查看錶:sql

MariaDB [webinfo]> show tables; #django會自動幫咱們建立一些表,這些表適合權限認證以及日誌相關的表 +----------------------------+
| Tables_in_webinfo          |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| mysite_person              |          #這張表使咱們自定義的。其中models.py中的類名對應着表名,類中的類屬性對應字段名。
+----------------------------+
11 rows in set (0.00 sec) MariaDB [webinfo]> desc mysite_person; #表名的定義方式爲appname_classname, 表中自動建立了id列的主鍵。 +------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| first_name | varchar(30) | NO   |     | NULL    |                |
| last_name  | varchar(40) | NO   |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec) MariaDB [webinfo]>

上面的表中的字段類型爲varchar對應django字段類型爲CharField。CharField中的max_length=30屬性表示的字段最大長度,所以在表的字段定義中定義了varchar的長度爲30。經過以上的一個簡單的實例,應該瞭解了django中字段類型的含義。數據庫

字段是模型中最重要的內容之一,也是惟一必須的部分。字段在Python中表現爲一個類屬性,體現了數據表中的一個列。請不要使用clean、save、delete等Django內置的模型API名字。django

字段類型的做用:session

  • 決定數據庫中對應列的數據類型(例如:INTEGER, VARCHAR, TEXT)
  • HTML中對應的表單標籤的類型,例如<input type=「text」 />
  • 在admin後臺和自動生成的表單中最小的數據驗證需求

這裏也能夠看到使用django模型比使用python的orm模型的好處。下面說明一些常見的字段類型:app

官方文檔中對字段類型的介紹地址: https://docs.djangoproject.com/en/2.1/ref/models/fields/#filefield

類型 說明 AutoField: 一個自動增長的整數類型字段。一般你不須要本身編寫它,Django會自動幫你添加字段:id = models.AutoField(primary_key=True),這是一個自增字段,
       從1開始計數。若是你非要本身設置主鍵,那麼請務必將字段設置爲primary_key=True。Django在一個模型中只容許有一個自增字段,而且該字段必須爲主鍵! BigAutoField:(1.10新增)64位整數類型自增字段,數字範圍更大,從1到9223372036854775807 BigIntegerField: 64位整數字段(看清楚,非自增),相似IntegerField ,-9223372036854775808 到9223372036854775807。在Django的模板表單裏體現爲一個textinput標籤。 BinaryField: 二進制數據類型。使用受限,少用。 BooleanField:布爾值類型。默認值是None。在HTML表單中體現爲CheckboxInput標籤。若是要接收null值,請使用NullBooleanField。 CharField:字符串類型。必須接收一個max_length參數,表示字符串長度不能超過該值。默認的表單標籤是input text。最經常使用的filed,沒有之一! CommaSeparatedIntegerField: 逗號分隔的整數類型。必須接收一個max_length參數。經常使用於表示較大的金額數目,例如1,000,000元。 DateField: class DateField(auto_now=False, auto_now_add=False, **options)日期類型。一個Python中的datetime.date的實例。在HTML中表現爲TextInput標籤。
在admin後臺中,Django會幫你自動添加一個JS的日曆表和一個「Today」快捷方式,以及附加的日期合法性驗證。兩個重要參數:(參數互斥,不能共存)
auto_now:每當對象被保存時將字段設爲當前日期,經常使用於保存最後修改時間。auto_now_add:每當對象被建立時,設爲當前日期,經常使用於保存建立日期(注意,
它是不可修改的)。設置上面兩個參數就至關於給field添加了editable=False和blank=True屬性。若是想具備修改屬性,請用default參數。
例子:pub_time = models.DateField(auto_now_add=True),自動添加發布時間。 DateTimeField: 日期時間類型。Python的datetime.datetime的實例。與DateField相比就是多了小時、分和秒的顯示,其它功能、參數、用法、默認值等等都同樣。 DecimalField: 固定精度的十進制小數。至關於Python的Decimal實例,必須提供兩個指定的參數!參數max_digits:最大的位數,必須大於或等於小數點位數 。
         decimal_places:小數點位數,精度。 當localize
=False時,它在HTML表現爲NumberInput標籤,不然是text類型。
         例子:儲存最大不超過999,帶有2位小數位精度的數,定義以下:models.DecimalField(..., max_digits=5, decimal_places=2)。 DurationField: 持續時間類型。存儲必定期間的時間長度。相似Python中的timedelta。在不一樣的數據庫實現中有不一樣的表示方法。經常使用於進行時間之間的加減運算。
        可是當心了,這裏有坑,PostgreSQL等數據庫之間有兼容性問題! EmailField: 郵箱類型,默認max_length最大長度254位。使用這個字段的好處是,可使用DJango內置的EmailValidator進行郵箱地址合法性驗證。 FileField: class FileField(upload_to
=None, max_length=100, **options)上傳文件類型,後面單獨介紹。 FilePathField: 文件路徑類型,後面單獨介紹 FloatField: 浮點數類型,參考整數類型 ImageField: 圖像類型,後面單獨介紹。 IntegerField: 整數類型,最經常使用的字段之一。取值範圍-2147483648到2147483647。在HTML中表現爲NumberInput標籤。 GenericIPAddressField:class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)[source],IPV4或者IPV6地址,字符串形式,
           例如192.0.2.30或者2a02:42fe::4在HTML中表現爲TextInput標籤。參數protocol默認值爲‘both’,可選‘IPv4’或者‘IPv6’,表示你的IP地址類型。 NullBooleanField: 相似布爾字段,只不過額外容許NULL做爲選項之一。 PositiveIntegerField: 正整數字段,包含0,最大2147483647。 PositiveSmallIntegerField: 較小的正整數字段,從0到32767。 SlugField: slug是一個新聞行業的術語。一個slug就是一個某種東西的簡短標籤,包含字母、數字、下劃線或者鏈接線,一般用於URLs中。能夠設置max_length參數,默認爲50。 SmallIntegerField: 小整數,包含-32768到32767。 TextField: 大量文本內容,在HTML中表現爲Textarea標籤,最經常使用的字段類型之一!若是你爲它設置一個max_length參數,那麼在前端頁面中會受到輸入字符數量限制,
       然而在模型和數據庫層面卻不受影響。只有CharField才能同時做用於二者。 TimeField: 時間字段,Python中datetime.time的實例。接收同DateField同樣的參數,只做用於小時、分和秒。 URLField: 一個用於保存URL地址的字符串類型,默認最大長度200。 UUIDField: 用於保存通用惟一識別碼(Universally Unique Identifier)的字段。使用Python的UUID類。在PostgreSQL數據庫中保存爲uuid類型,其它數據庫中爲char(
32)。
      這個字段是自增主鍵的最佳替代品,後面有例子展現。

 

注意這裏有一個filefield類型的用法,暫時先空!

 

上面介紹了django中模型的字段類型,django中除了定義字段的類型,還有相似於mysql中約束條件同樣,django對每種類型都有一些約束設置。

摘自:http://www.liujiangblog.com/course/django/97

全部的模型字段均可以接收必定數量的參數,好比CharField至少須要一個max_length參數。下面的這些參數是全部字段均可以使用的,而且是可選的。

null: 該值爲True時,Django在數據庫中使用NULL存儲空值。默認值爲False。對於保存字符串類型數據的字段,請儘可能避免將此參數設爲True,那樣會致使兩種‘沒有數據’的狀況,一種是NULL,另外一種是‘空字符串’。在大多數狀況下,使用兩種方法表示沒有數據時重複的,django決定使用空字符表示空值而不是NULL。

One exception is when a CharField has both unique=True and blank=True set. In this situation, null=True is required to avoid unique constraint violations when saving multiple objects with blank values.

blank: True時,字段值能夠爲空。默認False。和null參數不一樣的是,null是純數據庫層面的,而blank是驗證相關的,它與表單驗證是否容許輸入框內爲空有關,與數據庫無關。

choice:它是一個可迭代的結構(好比,列表或是元組),由可迭代的二元組組成(好比[(A, B), (A, B) ...]),用來給這個字段提供選擇項。 若是設置了 choices ,默認表格樣式就會顯示選擇框,而不是標準的文本框,並且這個選擇框的選項就是 choices 中的元組。以下一個實例來講明choice的用法:

gender = models.CharField(default="female", choices=(("male", u""), ("female", u"")), verbose_name=u"性別",max_length=5)

#性別只有兩個選項,所以這裏使用了choice屬性。

 

db_column: 該參數用於定義當前字段在數據表內的列名。若是未指定,Django將使用字段名做爲列名。

db_index: 該參數接收布爾值。若是爲True,數據庫將爲該字段建立索引。

db_tablespace: 用於字段索引的數據庫表空間的名字,前提是當前字段設置了索引。默認值爲工程的DEFAULT_INDEX_TABLESPACE設置。若是使用的數據庫不支持表空間,該參數會被忽略。

default: 字段的默認值,能夠是值或者一個可調用對象。若是是可調用對象,那麼每次建立新對象時都會調用。設置的默認值不能是一個可變對象,好比列表、集合等等。lambda匿名函數也不可用於default的調用對象,由於匿名函數不能被migrations序列化。

注意:在某種緣由不明的狀況下將default設置爲None,可能會引起intergyerror:not null constraint failed,即非空約束失敗異常,致使python manage.py migrate失敗,此時可將None改成False或其它的值,只要不是None就行。

editable: 若是設爲False,那麼當前字段將不會在admin後臺或者其它的ModelForm表單中顯示,同時還會被模型驗證功能跳過。參數默認值爲True。

error_messages: 用於自定義錯誤信息。參數接收字典類型的值。字典的鍵能夠是null、 blank、 invalid、 invalid_choice、 unique和unique_for_date其中的一個。

help_text: 額外顯示在表單部件上的幫助文本。使用時請注意轉義爲純文本,防止腳本攻擊。

 

primary_key:
若是你沒有給模型的任何字段設置這個參數爲True,Django將自動建立一個AutoField自增字段,名爲‘id’,並設置爲主鍵。也就是id = models.AutoField(primary_key=True)

若是你爲某個字段設置了primary_key=True,則當前字段變爲主鍵,並關閉Django自動生成id主鍵的功能。

primary_key=True隱含null=False和unique=True的意思。一個模型中只能有一個主鍵字段!

另外,主鍵字段不可修改,若是你給某個對象的主鍵賦個新值其實是建立一個新對象,並不會修改原來的對象。

unique:
設爲True時,在整個數據表內該字段的數據不可重複。

注意:對於ManyToManyField和OneToOneField關係類型,該參數無效。

注意: 當unique=True時,db_index參數無須設置,由於unqiue隱含了索引。

注意:自1.11版本後,unique參數能夠用於FileField字段。

unique_for_date
日期惟一。可能不太好理解。舉個栗子,若是你有一個名叫title的字段,並設置了參數unique_for_date="pub_date",那麼Django將不容許有兩個模型對象具有一樣的title和pub_date。有點相似聯合約束。若是指向的是日期,也就是說僅僅日期是惟一的。

unique_for_month
同上,只是月份惟一。

unique_for_year
同上,只是年份惟一。

verbose_name: 暫空。

validators: 運行在該字段上的驗證器的列表。

相關文章
相關標籤/搜索