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


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

在使用模型之前,我們首先設置數據庫選項,django的默認數據庫時sqlite3,這里我們設置數據庫引擎為mysql。

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中的字段類型。

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

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

執行如下操作:

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
命令的結果是在數據庫中創建了對應的表

在數據庫中查看表:

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名字。

字段類型的作用:

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

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

官方文檔中對字段類型的介紹地址: 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: 運行在該字段上的驗證器的列表。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM