ORM(二)常用字段小記
常用字段類型:
AutoField:字段自增,多用於ID主鍵字段,每個表中只能有一個AutoField字段類型。
id = models.AutoField(primary_key=True) # 設置id字段為主鍵並自增長
AutoField字段是根據IntegerField類型自動遞增的。而IntegerField的取值範圍是:-2147483648到2147483647
BigAutoField:與AutoField功能相同都是自增,但是他的取值範圍要更大:1到9223372036854775807
IntegerField:一個整數。取值範圍-2147483648到2147483647。此字段的默認表單控件是 NumberInput當localize 為False或TextInput以其他方式。
BigIntegerField:一個64位整數,很像一個IntegerField不同之處在於它是保證從適合數字-9223372036854775808到 9223372036854775807。此字段的默認表單窗口小部件是a TextInput。
BinaryField:用於存儲原始二進制數據的字段。它只支持bytes分配。請註意,此字段的功能有限。例如,無法過濾BinaryField值的查詢集。也不可能在a BinaryField中包含a ModelForm。
PositiveIntegerField:像一個IntegerField,但必須是正數或零(0)。從價值觀0到2147483647在Django支持的所有數據庫的安全。0出於向後兼容性原因,接受該值。
BooleanField:真/假字段。此字段的默認表單窗口小部件是CheckboxInput。如果您需要接受null值,適用NullBooleanField。當Field.default 沒有定義,默認值BooleanField是None。
NullBooleanField:像一個BooleanField,允許NULL作為選項之一。使用此而不是BooleanField使用null=True。此字段的默認表單窗口小部件是NullBooleanSelect。
CharField:字符串字段(varchar)。對於大量文本,請使用TextField。此字段的默認表單窗口小部件是TextInput。
CharField 有一個額外的必要參數:CharField(max_length=20)字段的最大長度(以字符為單位)。max_length在數據庫級別和Django的驗證中強制執行。
TextField:一個大的文本字段。此字段的默認表單窗口小部件是a Textarea。
如果指定max_length屬性,它將反映在Textarea自動生成的表單字段的 窗口小部件中。但是,它不會在模型或數據庫級別強制執行。
DateField:日期,由Python datetime.date實例表示。
有一些額外的可選參數:
auto_now:每次保存對象時自動將字段設置為當前時間,該字段僅在Model.save()後,會更新該字段的日期。
auto_now_add:首次創建對象時自動將字段設置為當前時間。此字段的默認表單窗口小部件是TextInput。管理員添加了一個JavaScript日歷,以及“今天”的快捷方式。包含其他invalid_date錯誤消息密鑰。選項auto_now_add,auto_now和default互相排斥。這些選項的任何組合都將導致錯誤。
DateTimeField:日期和時間,由Python datetime.datetime實例表示。采取相同的額外參數DateField。此字段的默認表單窗口小部件是單個 TextInput。管理員使用兩個單獨的 TextInput小部件和JavaScript快捷方式。
TimeField:一個時間,由Python datetime.time實例表示。接受相同的自動填充選項DateField。
此字段的默認表單窗口小部件是a TextInput。管理員添加了一些JavaScript快捷方式。
DecimalField:一個固定精度的十進制數,由Python Decimal實例表示。
有兩個必需的參數:
DecimalField.max_digits:數字中允許的最大位數。請註意,此數字必須大於或等於decimal_places。
DecimalField.decimal_places:與數字一起存儲的小數位數。
此字段的默認表單控件是NumberInput 當localize為False或 TextInput以其他方式。
DurationField:用於存儲時間段的字段 - 用Python建模 timedelta。在PostgreSQL上使用時,使用interval的數據類型是Oracle,數據類型是。否則使用一微秒。INTERVAL DAY(9) TO SECOND(6)bigint
EmailField:CharField檢查該值是否為有效電子郵件地址的A. 它用於EmailValidator驗證輸入。
FileField:文件上傳字段。Django Admin以及ModelForm中提供讀取文件夾下文件的功能
參數:
path, 文件夾路徑
match=None, 正則匹配
recursive=False, 遞歸下面的文件夾
allow_files=True, 允許文件
FilePathField:文件路徑字段,字符串,路徑保存在數據庫,文件上傳到指定目錄
參數:
upload_to = "" 上傳文件的保存路徑
storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage
FloatField:由float實例在Python中表示的浮點數。此字段的默認表單控件是NumberInput 當localize為False或 TextInput以其他方式。
ImageField:從中繼承所有屬性和方法FileField,但也驗證上載的對象是有效圖像。
除了可用於特殊屬性FileField,一個ImageField也具有height和width屬性。
為了便於查詢這些屬性,ImageField有兩個額外的可選參數:
ImageField.height_field:每次保存模型實例時,將使用圖像高度自動填充的模型字段的名稱。
ImageField.width_field:每次保存模型實例時,將使用圖像寬度自動填充的模型字段的名稱。
ImageField實例在數據庫中創建為varchar 默認最大長度為100個字符的列。與其他字段一樣,您可以使用max_length參數更改最大長度。
此字段的默認表單窗口小部件是a ClearableFileInput。
GenericIPAddressField:IPv4或IPv6地址,采用字符串格式(例如192.0.2.30或 2a02:42fe::4)。此字段的默認表單窗口小部件是TextInput。
GenericIPAddressField.protocol:限制指定協議的有效輸入。可接受的值是‘both‘(默認),‘IPv4‘ 或‘IPv6‘。匹配不區分大小寫。
GenericIPAddressField.unpack_ipv4:解壓縮IPv4映射地址,如::ffff:192.0.2.1。如果啟用此選項,則該地址將被解壓縮到 192.0.2.1。默認為禁用。只能在protocol設置為時使用‘both‘。如果允許空值,則必須允許空值,因為空值存儲為空。
SlugField:Slug是一個報紙術語。slu is是一種短標簽,只包含字母,數字,下劃線或連字符。它們通常用於URL。
與CharField類似,您可以指定max_length(閱讀有關數據庫可移植性的說明以及max_length該部分中的說明)。如果max_length未指定,Django將使用默認長度50。
意味著設置Field.db_index為True。
基於某個其他值的值自動預填充SlugField通常很有用。您可以在管理員中自動執行此操作 prepopulated_fields。
SlugField.allow_unicode:如果True,該字段除ASCII字母外還接受Unicode字母。默認為False。
SmallIntegerField:像一個IntegerField,但只允許某個(數據庫相關)點下的值。從價值觀-32768到32767在Django支持的所有數據庫的安全。
URLField:一個CharField一個網址。
此字段的默認表單窗口小部件是a TextInput。
與所有CharField子類一樣,URLField采用可選 max_length參數。如果未指定 max_length,則使用默認值200。
UUIDField:用於存儲通用唯一標識符的字段。使用Python的 UUID類。在PostgreSQL上使用時,它以uuid數據類型存儲,否則存儲在 char(32)。
通用唯一標識符是AutoFieldfor的 一個很好的替代品primary_key。數據庫不會為您生成UUID,因此建議使用default:
import uuid from django.db import models class MyUUIDModel(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
關系字段:
ForeignKey:多對一的關系。需要兩個位置參數:與模型相關的類和on_delete選項。(on_delete實際上並不需要,但不提供它會給出棄用警告。在Django 2.0中將需要它。)
要創建遞歸關系 - 與自身具有多對一關系的對象 - 使用。models.ForeignKey(‘self‘, on_delete=models.CASCADE)
如果需要在尚未定義的模型上創建關系,可以使用模型的名稱,而不是模型對象本身:
on_delete選項:
CASCADE:級聯刪除。Django模擬SQL約束ON DELETE CASCADE的行為,並刪除包含ForeignKey的對象。
PROTECT:通過引發ProtectedError子類來 防止刪除引用的對象 django.db.IntegrityError。
SET_NULL:設置ForeignKeynull, 這是如果只可能 null是True。
SET_DEFAULT:將ForeignKey其設置為默認值;,ForeignKey必須設置的默認值 。
DO_NOTHING:不采取行動。如果數據庫後端強制實施參照完整性,則IntegrityError除非您手動將SQL 約束添加到數據庫字段,否則將導致這種情況。ON DELETE
SET():設置ForeignKey傳遞給的值SET(),或者傳入 一個callable,調用它的結果。在大多數情況下,為了避免在導入models.py時執行查詢,必須傳遞callable:
from django.conf import settings from django.contrib.auth import get_user_model from django.db import models 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), )
ManyToManyField:多對多的關系。需要一個位置參數與模型相關的類,它與ForeignKey作用完全相同 ,包括遞歸和 惰性關系。
可以使用字段添加,刪除或創建相關對象 RelatedManager。
OneToOneField:一對一的關系。從概念上講,這類似於 ForeignKeywith unique=True,但關系的“反向”方面將直接返回單個對象。
這作為模型的主鍵是最有用的,它以某種方式“擴展”另一個模型; 例如,通過從子模型向父模型添加隱式一對一關系來實現多表繼承。
需要一個位置參數:與模型相關的類。這與它的工作方式完全相同ForeignKey,包括有關遞歸 和惰性關系的所有選項。
如果沒有related_name為其指定參數OneToOneField,Django將使用當前模型的小寫名稱作為默認值。
參考文檔:https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.AutoField
ORM(二)常用字段小記