Django - ORM字段及字段參數

1、經常使用字段

AutoField

int自增列,必須填入參數 primary_key=True。當model中若是沒有自增列,則自動會建立一個列名爲id的列。git

 

IntegerField

一個整數類型,範圍在 -2147483648 to 2147483647。數據庫

 

CharField

字符類型,必須提供max_length參數, max_length表示字符長度。django

 

DateField

日期字段,日期格式  YYYY-MM-DD,至關於Python中的datetime.date()實例。app

 

DateTimeField

日期時間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],至關於Python中的datetime.datetime()實例。ide

 

2、字段合集

  1    AutoField(Field)
  2         - int自增列,必須填入參數 primary_key=True
  3 
  4     BigAutoField(AutoField)
  5         - bigint自增列,必須填入參數 primary_key=True
  6 
  7         注:當model中若是沒有自增列,則自動會建立一個列名爲id的列
  8         from django.db import models
  9 
 10         class UserInfo(models.Model):
 11             # 自動建立一個列名爲id的且爲自增的整數列
 12             username = models.CharField(max_length=32)
 13 
 14         class Group(models.Model):
 15             # 自定義自增列
 16             nid = models.AutoField(primary_key=True)
 17             name = models.CharField(max_length=32)
 18 
 19     SmallIntegerField(IntegerField):
 20         - 小整數 -3276832767
 21 
 22     PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
 23         - 正小整數 032767
 24     IntegerField(Field)
 25         - 整數列(有符號的) -21474836482147483647
 26 
 27     PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
 28         - 正整數 02147483647
 29 
 30     BigIntegerField(IntegerField):
 31         - 長整型(有符號的) -92233720368547758089223372036854775807
 32 
 33     BooleanField(Field)
 34         - 布爾值類型
 35 
 36     NullBooleanField(Field):
 37         - 能夠爲空的布爾值
 38 
 39     CharField(Field)
 40         - 字符類型
 41         - 必須提供max_length參數, max_length表示字符長度
 42 
 43     TextField(Field)
 44         - 文本類型
 45 
 46     EmailField(CharField):
 47         - 字符串類型,Django Admin以及ModelForm中提供驗證機制
 48 
 49     IPAddressField(Field)
 50         - 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制
 51 
 52     GenericIPAddressField(Field)
 53         - 字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6
 54         - 參數:
 55             protocol,用於指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
 56             unpack_ipv4, 若是指定爲True,則輸入::ffff:192.0.2.1時候,可解析爲192.0.2.1,開啓此功能,須要protocol="both"
 57 
 58     URLField(CharField)
 59         - 字符串類型,Django Admin以及ModelForm中提供驗證 URL
 60 
 61     SlugField(CharField)
 62         - 字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下劃線、鏈接符(減號)
 63 
 64     CommaSeparatedIntegerField(CharField)
 65         - 字符串類型,格式必須爲逗號分割的數字
 66 
 67     UUIDField(Field)
 68         - 字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證
 69 
 70     FilePathField(Field)
 71         - 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能
 72         - 參數:
 73                 path,                      文件夾路徑
 74                 match=None,                正則匹配
 75                 recursive=False,           遞歸下面的文件夾
 76                 allow_files=True,          容許文件
 77                 allow_folders=False,       容許文件夾
 78 
 79     FileField(Field)
 80         - 字符串,路徑保存在數據庫,文件上傳到指定目錄
 81         - 參數:
 82             upload_to = ""      上傳文件的保存路徑
 83             storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage
 84 
 85     ImageField(FileField)
 86         - 字符串,路徑保存在數據庫,文件上傳到指定目錄
 87         - 參數:
 88             upload_to = ""      上傳文件的保存路徑
 89             storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage
 90             width_field=None,   上傳圖片的高度保存的數據庫字段名(字符串)
 91             height_field=None   上傳圖片的寬度保存的數據庫字段名(字符串)
 92 
 93     DateTimeField(DateField)
 94         - 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
 95 
 96     DateField(DateTimeCheckMixin, Field)
 97         - 日期格式      YYYY-MM-DD
 98 
 99     TimeField(DateTimeCheckMixin, Field)
100         - 時間格式      HH:MM[:ss[.uuuuuu]]
101 
102     DurationField(Field)
103         - 長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值爲datetime.timedelta類型
104 
105     FloatField(Field)
106         - 浮點型
107 
108     DecimalField(Field)
109         - 10進制小數
110         - 參數:
111             max_digits,小數總長度
112             decimal_places,小數位長度
113 
114     BinaryField(Field)
115         - 二進制類型
字段集合

3、自定義字段

1 class UnsignedIntegerField(models.IntegerField):
2     def db_type(self, connection):
3         return 'integer UNSIGNED'

自定義char類型字段:

 1 class FixedCharField(models.Field):
 2     """
 3     自定義的char類型的字段類
 4     """
 5     def __init__(self, max_length, *args, **kwargs):
 6         self.max_length = max_length
 7         super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)
 8 
 9     def db_type(self, connection):
10         """
11         限定生成數據庫表的字段類型爲char,長度爲max_length指定的值
12         """
13         return 'char(%s)' % self.max_length
14 
15 
16 class Class(models.Model):
17     id = models.AutoField(primary_key=True)
18     title = models.CharField(max_length=25)
19     # 使用自定義的char類型的字段
20     cname = FixedCharField(max_length=25)

建立的表結構:

 1 附ORM字段與數據庫實際字段的對應關係
 2 對應關係:
 3     'AutoField': 'integer AUTO_INCREMENT',
 4     'BigAutoField': 'bigint AUTO_INCREMENT',
 5     'BinaryField': 'longblob',
 6     'BooleanField': 'bool',
 7     'CharField': 'varchar(%(max_length)s)',
 8     'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
 9     'DateField': 'date',
10     'DateTimeField': 'datetime',
11     'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
12     'DurationField': 'bigint',
13     'FileField': 'varchar(%(max_length)s)',
14     'FilePathField': 'varchar(%(max_length)s)',
15     'FloatField': 'double precision',
16     'IntegerField': 'integer',
17     'BigIntegerField': 'bigint',
18     'IPAddressField': 'char(15)',
19     'GenericIPAddressField': 'char(39)',
20     'NullBooleanField': 'bool',
21     'OneToOneField': 'integer',
22     'PositiveIntegerField': 'integer UNSIGNED',
23     'PositiveSmallIntegerField': 'smallint UNSIGNED',
24     'SlugField': 'varchar(%(max_length)s)',
25     'SmallIntegerField': 'smallint',
26     'TextField': 'longtext',
27     'TimeField': 'time',
28     'UUIDField': 'char(32)',

4、字段參數

Null

用於表示某個字段能夠爲空。spa

 

Unique

若是設置爲unique=True 則該字段在此表中必須是惟一的 。code

 

db_index

若是db_index=True 則表明着爲此字段設置索引。orm

 

default

爲該字段設置默認值。對象

 

5、DateField和DateTimeField

auto_now_add

配置auto_now_add=True,建立數據記錄的時候會把當前時間添加到數據庫。blog

 

auto_now

配置上auto_now=True,每次更新數據記錄的時候會更新該字段。

 

6、關係字段:ForeignKey

外鍵類型在ORM中用來表示外鍵關聯關係,通常把ForeignKey字段設置在 '一對多'中'多'的一方。

ForeignKey能夠和其餘表作關聯關係同時也能夠和自身作關聯關係。

To

設置要關聯的表

 

to_field

設置要關聯的表的字段

 

related_name

反向操做時,使用的字段名,用於代替原反向查詢時的'表名_set'。

例如:

 1 class Classes(models.Model):
 2     name = models.CharField(max_length=32)
 3 
 4 class Student(models.Model):
 5     name = models.CharField(max_length=32)
 6     theclass = models.ForeignKey(to="Classes")
 7 當咱們要查詢某個班級關聯的全部學生(反向查詢)時,咱們會這麼寫:
 8 models.Classes.objects.first().student_set.all()
 9 當咱們在ForeignKey字段中添加了參數 related_name 後,
10 class Student(models.Model):
11     name = models.CharField(max_length=32)
12     theclass = models.ForeignKey(to="Classes", related_name="students")
13 當咱們要查詢某個班級關聯的全部學生(反向查詢)時,咱們會這麼寫:
14 models.Classes.objects.first().students.all()

related_query_name

反向查詢操做時,使用的鏈接前綴,用於替換表名。

 

on_delete

當刪除關聯表中的數據時,當前表與其關聯的行的行爲。

models.CASCADE
刪除關聯數據,與之關聯也刪除


models.DO_NOTHING
刪除關聯數據,引起錯誤IntegrityError


models.PROTECT
刪除關聯數據,引起錯誤ProtectedError


models.SET_NULL
刪除關聯數據,與之關聯的值設置爲null(前提FK字段須要設置爲可空)


models.SET_DEFAULT
刪除關聯數據,與之關聯的值設置爲默認值(前提FK字段須要設置默認值)


models.SET

刪除關聯數據,
a. 與之關聯的值設置爲指定值,設置:models.SET(值)
b. 與之關聯的值設置爲可執行對象的返回值,設置:models.SET(可執行對象)

1 def func():
2     return 10
3 
4 class MyModel(models.Model):
5     user = models.ForeignKey(
6         to="User",
7         to_field="id"8         on_delete=models.SET(func)
9     )

 

db_constraint

是否在數據庫中建立外鍵約束,默認爲True。

7、關係字段:OneToOneField

一對一字段。

一般一對一字段用來擴展已有字段。

To

設置要關聯的表。

 

to_field

設置要關聯的表的字段

 

on_delete

同ForeignKey字段。

 

8、關係字段:ManyToManyField

用於表示多對多的關聯關係。在數據庫中經過第三張表來創建關聯關係

To

設置要關聯的表

 

related_name

同ForeignKey字段。

 

related_query_name

同ForeignKey字段。

 

symmetrical

僅用於多對多自關聯時,指定內部是否建立反向操做的字段。默認爲True。

舉個例子:

1 class Person(models.Model):
2     name = models.CharField(max_length=16)
3     friends = models.ManyToManyField("self")
4 此時,person對象就沒有person_set屬性。
5 class Person(models.Model):
6     name = models.CharField(max_length=16)
7     friends = models.ManyToManyField("self", symmetrical=False)
8 此時,person對象如今就可使用person_set屬性進行反向查詢。

 

hrough

在使用ManyToManyField字段時,Django將自動生成一張表來管理多對多的關聯關係。

但咱們也能夠手動建立第三張表來管理多對多關係,此時就須要經過through來指定第三張表的表名。

 

through_fields

設置關聯的字段。

 

db_table

默認建立第三張表時,數據庫中表的名稱。

 

9、元信息

ORM對應的類裏面包含另外一個Meta類,而Meta類封裝了一些數據庫的信息。主要字段以下:

db_table

ORM在數據庫中的表名默認是 app_類名,能夠經過db_table能夠重寫表名。

 

index_together

聯合索引。

 

unique_together

聯合惟一索引。

 

ordering

指定默認按什麼字段排序。

只有設置了該屬性,咱們查詢到的結果才能夠被reverse()。

相關文章
相關標籤/搜索