ORM字段

  1、AutoField

    int自增列,必須填入參數 primary_key=True。當model中如果沒有自增列,則自動會創建一個列名為id的列。

  2、IntegerField

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

  3、CharField

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

  4、DateField

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

  5、DateTimeField

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

  6、常用和非常用字段

AutoField(Field)
- int自增列,必須填入參數 primary_key=True

BigAutoField(AutoField)
- bigint自增列,必須填入參數 primary_key=True

注:當model中如果沒有自增列,則自動會創建一個列名為id的列
from django.db import models

class UserInfo(models.Model):
# 自動創建一個列名為id的且為自增的整數列
username = models.CharField(max_length=32)

class Group(models.Model):
# 自定義自增列
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)

SmallIntegerField(IntegerField):
- 小整數 -32768 ~ 32767

PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正小整數 0 ~ 32767
IntegerField(Field)
- 整數列(有符號的) -2147483648 ~ 2147483647

PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正整數 0 ~ 2147483647

BigIntegerField(IntegerField):
- 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807

BooleanField(Field)
- 布爾值類型

NullBooleanField(Field):
- 可以為空的布爾值

CharField(Field)
- 字符類型
- 必須提供max_length參數, max_length表示字符長度

TextField(Field)
- 文本類型

EmailField(CharField):
- 字符串類型,Django Admin以及ModelForm中提供驗證機制

IPAddressField(Field)
- 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制

GenericIPAddressField(Field)
- 字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6
- 參數:
protocol,用於指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
unpack_ipv4, 如果指定為True,則輸入::ffff:192.0.2.1時候,可解析為192.0.2.1,開啓此功能,需要protocol="both"

URLField(CharField)
- 字符串類型,Django Admin以及ModelForm中提供驗證 URL

SlugField(CharField)
- 字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下劃線、連接符(減號)

CommaSeparatedIntegerField(CharField)
- 字符串類型,格式必須為逗號分割的數字

UUIDField(Field)
- 字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證

FilePathField(Field)
- 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能
- 參數:
path,                      文件夾路徑
match=None,                正則匹配
recursive=False,           遞歸下面的文件夾
allow_files=True,          允許文件
allow_folders=False,       允許文件夾

FileField(Field)
- 字符串,路徑保存在數據庫,文件上傳到指定目錄
- 參數:
upload_to = ""      上傳文件的保存路徑
storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage

ImageField(FileField)
- 字符串,路徑保存在數據庫,文件上傳到指定目錄
- 參數:
upload_to = ""      上傳文件的保存路徑
storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage
width_field=None,   上傳圖片的高度保存的數據庫字段名(字符串)
height_field=None   上傳圖片的寬度保存的數據庫字段名(字符串)

DateTimeField(DateField)
- 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

DateField(DateTimeCheckMixin, Field)
- 日期格式      YYYY-MM-DD

TimeField(DateTimeCheckMixin, Field)
- 時間格式      HH:MM[:ss[.uuuuuu]]

DurationField(Field)
- 長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值為datetime.timedelta類型

FloatField(Field)
- 浮點型

DecimalField(Field)
- 10進制小數
- 參數:
max_digits,小數總長度
decimal_places,小數位長度

BinaryField(Field)
- 二進制類型

  對應關係

對應關係:
    'AutoField': 'integer AUTO_INCREMENT',
    'BigAutoField': 'bigint AUTO_INCREMENT',
    'BinaryField': 'longblob',
    'BooleanField': 'bool',
    'CharField': 'varchar(%(max_length)s)',
    'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
    'DateField': 'date',
    'DateTimeField': 'datetime',
    'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
    'DurationField': 'bigint',
    'FileField': 'varchar(%(max_length)s)',
    'FilePathField': 'varchar(%(max_length)s)',
    'FloatField': 'double precision',
    'IntegerField': 'integer',
    'BigIntegerField': 'bigint',
    'IPAddressField': 'char(15)',
    'GenericIPAddressField': 'char(39)',
    'NullBooleanField': 'bool',
    'OneToOneField': 'integer',
    'PositiveIntegerField': 'integer UNSIGNED',
    'PositiveSmallIntegerField': 'smallint UNSIGNED',
    'SlugField': 'varchar(%(max_length)s)',
    'SmallIntegerField': 'smallint',
    'TextField': 'longtext',
    'TimeField': 'time',
    'UUIDField': 'char(32)',

ORM字段參數

  1、null

    用於表示某個字段可以為空。

  2、unique

    如果設置為unique=True 則該字段在此表中必須是唯一的 。

  3、db_index

    如果db_index=True 則代表着為此字段設置索引。

  4、default

    為該字段設置默認值。

  5、DateField和DateTimeField

    auto_now_add

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

    auto_now

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

null                數據庫中字段是否可以為空
db_column           數據庫中字段的列名
db_tablespace
default             數據庫中字段的默認值
primary_key         數據庫中字段是否為主鍵
db_index            數據庫中字段是否可以建立索引
unique              數據庫中字段是否可以建立唯一索引
unique_for_date     數據庫中字段【日期】部分是否可以建立唯一索引
unique_for_month    數據庫中字段【月】部分是否可以建立唯一索引
unique_for_year     數據庫中字段【年】部分是否可以建立唯一索引

verbose_name        Admin中顯示的字段名稱
blank               Admin中是否允許用户輸入為空
editable            Admin中是否可以編輯
help_text           Admin中該字段的提示信息
choices             Admin中顯示選擇框的內容,用不變動的數據放在內存中從而避免跨表操作
如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)

error_messages      自定義錯誤信息(字典類型),從而定製想要顯示的錯誤信息;
字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
如:{'null': "不能為空.", 'invalid': '格式錯誤'}

validators          自定義錯誤驗證(列表類型),從而定製想要的驗證規則
from django.core.validators import RegexValidator
from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
如:
test = models.CharField(
max_length=32,
error_messages={
'c1': '優先錯信息1',
'c2': '優先錯信息2',
'c3': '優先錯信息3',
},
validators=[
RegexValidator(regex='root_\d+', message='錯誤了', code='c1'),
RegexValidator(regex='root_112233\d+', message='又錯誤了', code='c2'),
EmailValidator(message='又錯誤了', code='c3'), ]
                            )

關係字段

  1、ForeignKey

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

    ForeignKey可以和其他表做關聯關係同時也可以和自身做關聯關係。

    1.1、to

      設置要關聯的表

    1.2、to_filed

      設置要關聯的表的字段

    1.3、related_name

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

    例如

class Classes(models.Model):
    name = models.CharField(max_length=32)

class Student(models.Model):
    name = models.CharField(max_length=32)
    theclass = models.ForeignKey(to="Classes")

  當我們要查詢某個班級關聯的所有學生(反向查詢)時,我們會這麼寫:

models.Classes.objects.first().student_set.all()

  當我們在ForeignKey字段中添加了參數 related_name 後,

class Student(models.Model):
    name = models.CharField(max_length=32)
    theclass = models.ForeignKey(to="Classes", related_name="students")

  當我們要查詢某個班級關聯的所有學生(反向查詢)時,我們會這麼寫:

models.Classes.objects.first().students.all()

    1.4、related_query_name

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

    1.5、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(可執行對象)

def func():
    return 10

class MyModel(models.Model):
    user = models.ForeignKey(
        to="User",
        to_field="id",
        on_delete=models.SET(func)
    )

    1.6、db_constraint

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

  2、OneToOneField

    一對一字段。

    通常一對一字段用來擴展已有字段。

    一對一的關聯關係多用在當一張表的不同字段查詢頻次差距過大的情況下,將本可以存儲在一張表的字段拆開放置在兩張表中,然後將兩張表建立一對一的關聯關係。

class Author(models.Model):
    name = models.CharField(max_length=32)
    info = models.OneToOneField(to='AuthorInfo')
    

class AuthorInfo(models.Model):
    phone = models.CharField(max_length=11)
    email = models.EmailField()

    2.1、to

      設置要關聯的表

    2.2、to_filed

      設置要關聯的表的字段

    2.3、on_delete

      同ForeignKey字段。

  3、ManyToManyField

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

    3.1、to

      設置要關聯的表

    3.2、related_name

      同ForeignKey字段。

    3.3、related_query_name

      同ForeignKey字段。

    3.4、symmetrical

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

      舉個例子:

class Person(models.Model):
    name = models.CharField(max_length=16)
    friends = models.ManyToManyField("self")

    此時,person對象就沒有person_set屬性。

class Person(models.Model):
    name = models.CharField(max_length=16)
    friends = models.ManyToManyField("self", symmetrical=False)

    此時,person對象現在就可以使用person_set屬性進行反向查詢。

    3.5、through

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

      但我們也可以手動創建第三張表來管理多對多關係,此時就需要通過through來指定第三張表的表名。

    3.6、through_fields

      設置關聯的字段。

    3.7、db_table

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