Django中的AutoField字段使用
【Django是一個(gè)機(jī)智的框架】
默認(rèn)情況下Djang會(huì)為ORM中定義的每一張表加上一個(gè)自增ID列,并且用這個(gè)列來做主鍵;出于一個(gè)MySQL-DBA的工作經(jīng)歷我覺得
Djanog還真是機(jī)智;這樣么說主要是因?yàn)槲矣龅竭^許多主從延時(shí)的問題,有些比較過分的會(huì)延時(shí)好幾周,通常這些都是因?yàn)閎inlog格式
為“ROW”但是表上不存在主鍵引起的。
如果當(dāng)前網(wǎng)站用的是Django開發(fā)的,我想就不會(huì)有這種事情發(fā)生了吧。
【AutoField】
Django默認(rèn)的行為就像這樣
class TestModel(models.Model): id = models.AutoField(primary_key=True)
數(shù)據(jù)庫層面對應(yīng)的SQL如下
CREATE TABLE `myapp_testmodel` ( `id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8
【注意】
如果你想的工增加AutoField列,但是又不指定這個(gè)列做為主鍵的話,是會(huì)報(bào)錯(cuò)的
class TestModel(models.Model): tid = models.AutoField()
不顯示指定主鍵,但是又給表增加AutoField列的話就會(huì)報(bào)錯(cuò)
assert not cls._meta.auto_field, 'Model %s can’t have more than one AutoField.' % cls._meta.labelAssertionError: Model myapp.TestModel can’t have more than one AutoField.
補(bǔ)充知識:Django中models下常用Field以及字段參數(shù)
一、常見的FieldType數(shù)據(jù)庫字段類型
1、AutoField:自增Field域,自動(dòng)增加的一個(gè)數(shù)據(jù)庫字段類型,例如id字段就可以使用該數(shù)據(jù)類型,參數(shù)中必須填入primary_key=True
2、BigAutoField:和AutoField相同,只是比AutoField要大,參數(shù)中必須填入primary_key=True
3、BigIntegerField:大整型,只要用于存儲(chǔ)整型的數(shù)據(jù)
4、BinaryField:主要是存儲(chǔ)原始的二進(jìn)制數(shù)據(jù)
5、BooleanField:主要是存儲(chǔ)布爾類型的數(shù)據(jù),0和1
6、CharField:主要存儲(chǔ)字符串的數(shù)據(jù)類型
7、DateField:主要存儲(chǔ)日期類型的數(shù)據(jù)類型,日期格式為YYYY-MM-DD
8、DateTimeField:主要存儲(chǔ)時(shí)間相關(guān)的數(shù)據(jù)類型,格式為YYYY-MM-DD HH:MM:[ss[.uuuuuu]][TZ]
注意:DateField與DateTimeField有兩個(gè)屬性,配置auto_now_add=True,創(chuàng)建數(shù)據(jù)記錄的時(shí)候會(huì)把當(dāng)前時(shí)間添加到數(shù)據(jù)庫,配置auto_now=True,每次更新數(shù)據(jù)記錄的時(shí)候都會(huì)更新該字段
9、DecimalField:主要存儲(chǔ)固定精度的十進(jìn)制數(shù)據(jù)
--參數(shù):max_digits(小數(shù)總長度)/decimal_places(小數(shù)位長度)
10、EmailField:存儲(chǔ)電子郵件格式的數(shù)據(jù),Django Admin以及ModelForm中提供驗(yàn)證機(jī)制
11、FileField:存儲(chǔ)文件類型的數(shù)據(jù),文件上傳到指定目錄
--參數(shù):upload_to='....'(上傳文件的保存路徑)/storage=None(存儲(chǔ)組件,默認(rèn)django.core.files.storage.FileSystemStorage)
12、FilePathField:存儲(chǔ)文件路徑的數(shù)據(jù),提供讀取文件夾下文件的功能
--參數(shù):path(文件夾路徑)/match=None(正則匹配)/recursive=False(遞歸下面的文件夾)/allow_files=True(允許文件)/allow_folders=False(允許文件夾)
13、FloatField:存儲(chǔ)浮點(diǎn)型數(shù)據(jù)
14、ImageField:存儲(chǔ)圖片型數(shù)據(jù),文件上傳到指定目錄
--參數(shù):upload_to='.....'(上傳文件的保存路徑)/storage=None(存儲(chǔ)組件,默認(rèn)django.core.files.storage.FileSystemStorage)/width_field=None(上傳圖片的寬度保存的數(shù)據(jù)庫字段名<字符串>)/height_field=None(上傳圖片的高度保存的數(shù)據(jù)庫字段名<字符串>)
15、IntegerField:存儲(chǔ)整型數(shù)據(jù)
16、GenericIPAddressField:存儲(chǔ)IP地址信息數(shù)據(jù)
17、NullBooleanField:可以存儲(chǔ)布爾值數(shù)據(jù),也可以存儲(chǔ)空null數(shù)據(jù)
18、PositiveIntegerField:主要存儲(chǔ)正整數(shù)數(shù)據(jù)
19、SmallIntegerField:小整型,主要用于存儲(chǔ)整型的數(shù)據(jù)
20、TextField:存儲(chǔ)文章內(nèi)容信息數(shù)據(jù),存儲(chǔ)比較長的文本信息
21、TimeField:存儲(chǔ)時(shí)間信息
22、URLField:存儲(chǔ)URL網(wǎng)址信息,Django Admin以及ModelForm中提供驗(yàn)證url
23、IPAddressField:Django Admin以及ModelForm中提供驗(yàn)證IPV4機(jī)制
24、GenericIPAddressField:Django Admin以及ModelForm中提供驗(yàn)證IPV4和IPV6機(jī)制
二、常用關(guān)系型數(shù)據(jù)表處理Field
1、處理一對多關(guān)系數(shù)據(jù)表:使用ForeignKey
2、處理多對多關(guān)系數(shù)據(jù)表:使用ManyToManyField
三、字段參數(shù)
1、null:用于表示某個(gè)字段可以為空
2、unique:如果設(shè)置為unique=True則該字段在此表中必須是唯一的
3、db_index:如果db_index=True則代表這為此字段設(shè)置索引
4、default:為該字段設(shè)置默認(rèn)值
四、關(guān)系字段
1、to:設(shè)置要關(guān)聯(lián)的表
2、to_field:設(shè)置要關(guān)聯(lián)的表的字段
3、related_name:反向操作時(shí),使用的字段名,用于代替原反向查詢時(shí)的'表名_set'
4、on_delete:當(dāng)刪除關(guān)聯(lián)表中的數(shù)據(jù)時(shí),當(dāng)前表與其關(guān)聯(lián)的行的行為,例如刪除一個(gè)出版社,那么和這個(gè)出版社有關(guān)聯(lián)的書籍也都被刪除掉了,下面介紹on_delete的參數(shù)值:
on_delete=models.CASCADE:刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)也刪除
on_delete=models.DO_NOTHING:刪除關(guān)聯(lián)數(shù)據(jù),引發(fā)錯(cuò)誤IntegrityError
on_delete=models.PROTECT:刪除關(guān)聯(lián)數(shù)據(jù),引發(fā)錯(cuò)誤ProtectedError
on_delete=models.SET_NULL:刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)的值設(shè)置為null(前提FK字段需要設(shè)置為可空)
on_delete=models.SET_DEFAULT:刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)的值設(shè)置為默認(rèn)值(前提FK字段需要設(shè)置默認(rèn)值)
on_delete=models.SET:刪除關(guān)聯(lián)數(shù)據(jù):
a、與之關(guān)聯(lián)的值設(shè)置為指定值,設(shè)置:models.SET(值)
b、與之關(guān)聯(lián)的值設(shè)置為可執(zhí)行對象的返回值,設(shè)置:models.SET(可執(zhí)行對象)
5、db_constraint:是否在數(shù)據(jù)庫中創(chuàng)建外鍵約束,默認(rèn)為True,db_constraint一般使用在建立數(shù)據(jù)表連接關(guān)系當(dāng)中(例如創(chuàng)建外鍵),如果使用False,則是限制了表之間沒有關(guān)聯(lián),達(dá)到了軟連接的效果
五、元信息
ORM對應(yīng)的類里面包含另一個(gè)Meta類,而Meta類封裝了一些數(shù)據(jù)庫的信息,主要字段如下:
1、db_table:ORM在數(shù)據(jù)庫中的表名默認(rèn)為app_類名,可以通過db_table可以重寫表名
2、index_together:聯(lián)合索引,給兩列做索引
3、unique_together:聯(lián)合唯一索引,兩列不能重復(fù)
4、ordering:指定默認(rèn)按什么字段順序,只有設(shè)置了該屬性,我們查詢到的結(jié)果才可以被reverse()
具體介紹可以查看https://docs.djangoproject.com/en/dev/ref/models/fields/
以上這篇Django中的AutoField字段使用就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. php相對路徑轉(zhuǎn)化成絕對路徑2. django 利用Q對象與F對象進(jìn)行查詢的實(shí)現(xiàn)3. 淺談優(yōu)化Django ORM中的性能問題4. ajax4jsf 1.0.2 發(fā)布,添加新的a4j tags.5. Android 實(shí)現(xiàn)徹底退出自己APP 并殺掉所有相關(guān)的進(jìn)程6. 簡體中文轉(zhuǎn)換為繁體中文的PHP函數(shù)7. XML入門的常見問題(三)8. 《CSS3實(shí)戰(zhàn)》筆記--漸變設(shè)計(jì)(二)9. CSS linear-gradient屬性案例詳解10. HTML基礎(chǔ)詳解(上)
