1. django中的常用字段
1. AutoField
映射到數(shù)據(jù)庫中是int類型孕豹,可以有自動增長的特性涩盾。一般不需要使用這個類型,如果不指定主鍵励背,那么模型會自動的生成一個叫做id的自動增長的主鍵春霍。如果你想指定一個其他名字的并且具有自動增長的主鍵,使用AutoField也是可以的叶眉。
2. BigAutoField
64位的整形址儒,類似于AutoField芹枷,只不過是產(chǎn)生的數(shù)據(jù)的范圍是從1-9223372036854775807。
3. BooleanField
在模型層面接收的是True/False莲趣。在數(shù)據(jù)庫層面是tinyint類型鸳慈。如果沒有指定默認(rèn)值,默認(rèn)值是None喧伞。
4. CharField
在數(shù)據(jù)庫層面是varchar類型走芋。在Python層面就是普通的字符串。這個類型在使用的時候必須要指定最大的長度(max_lenth)潘鲫,也即必須要傳遞max_length這個關(guān)鍵字參數(shù)進去翁逞。
(choice = )
最大長度計算:https://www.cnblogs.com/canger/p/9850727.html
5. DateTimeField
日期時間類型,不僅僅可以存儲日期次舌,還可以存儲時間熄攘。映射到數(shù)據(jù)庫中是datetime類型。
在django中是有時區(qū)的概念的彼念,使用時要考慮到時區(qū)的問題挪圾,默認(rèn)使用的是 UTC時區(qū),分為 navie(沒時區(qū)) 和 aware(有時區(qū))逐沙,如果項目不是國際的哲思,可以我們將時區(qū)關(guān)閉,使用本地的時間吩案。
我們可以在settings.py 中修改相應(yīng)的時區(qū)和是否使用時區(qū)
TIME_ZONE = 'Asia/Shanghai'
USE_TZ= True # 為True意味在項目中使用的是 aware 時間棚赔,如果為false則意味著使用的是 navie 時間
TIME_ZONE = 'Asia/Shanghai'
from django.utils.timezone import localtime,now
auto_now:在每次這個數(shù)據(jù)保存的時候,都使用當(dāng)前的時間徘郭。
比如作為一個記錄修改日期的字段靠益,可以將這個屬性設(shè)置為True。
auto_now_add:在每次數(shù)據(jù)第一次被添加進去的時候残揉,都使用當(dāng)前的時間胧后。
比如作為一個記錄第一次入庫的字段,可以將這個屬性設(shè)置為True抱环。
6. EmailField
類似于CharField壳快。在數(shù)據(jù)庫底層也是一個varchar類型。最大長度是254個字符镇草。
7. FileField
用來存儲文件的眶痰。(upload_to= )指定存儲到哪個目錄下
8. ImageField
用來存儲圖片文件的。(upload_to= )指定存儲到哪個目錄下
9. FloatField
浮點類型梯啤。映射到數(shù)據(jù)庫中是float類型竖伯。
10.IntegerField
整形。值的區(qū)間是-2147483648——2147483647因宇。
11. BigIntegerField
大整形黔夭。值的區(qū)間是-9223372036854775808——9223372036854775807宏胯。
12. PositiveIntegerField
正整形羽嫡。值的區(qū)間是0——2147483647本姥。
13. SmallIntegerField
小整形。值的區(qū)間是-32768——32767杭棵。
14. PositiveSmallIntegerField
正小整形婚惫。值的區(qū)間是0——32767。
15. TextField
大量的文本類型魂爪。映射到數(shù)據(jù)庫中是longtext類型先舷。
16. UUIDField
只能存儲uuid格式的字符串。uuid是一個32位的全球唯一的字符串滓侍,一般用來作為主鍵蒋川。
17. URLField
類似于CharField,只不過只能用來存儲url格式的字符串撩笆。并且默認(rèn)的max_length是200捺球。
2. 字段中的常用屬性
1. null
如果設(shè)置為True,Django將會在映射表的時候指定是否為空夕冲。默認(rèn)是為False氮兵。在使用字符串相關(guān)的Field(CharField/TextField)的時候,官方推薦盡量不要使用這個參數(shù)歹鱼,也就是保持默認(rèn)值False泣栈。因為Django在處理字符串相關(guān)的Field的時候,即使這個Field的null=False弥姻,如果你沒有給這個Field傳遞任何值南片,那么Django也會使用一個空的字符串""來作為默認(rèn)值存儲進去。因此如果再使用null=True庭敦,Django會產(chǎn)生兩種空值的情形(NULL或者空字符串)疼进。如果想要在表單驗證的時候允許這個字符串為空,那么建議使用blank=True螺捐。如果你的Field是BooleanField颠悬,那么對應(yīng)的可空的字段則為NullBooleanField。
2. db_column
這個字段在數(shù)據(jù)庫中的名字定血。如果沒有設(shè)置這個參數(shù)赔癌,那么將會使用模型中屬性的名字。
3. default
默認(rèn)值澜沟≡制保可以為一個值,或者是一個函數(shù)茫虽,但是不支持lambda表達式刊苍。并且不支持列表/字典/集合等可變的數(shù)據(jù)結(jié)構(gòu)既们。
4. primary_key
是否為主鍵。默認(rèn)是False正什。
5. unique
在表中這個字段的值是否唯一啥纸。一般是設(shè)置手機號碼/郵箱等。
更多Field參數(shù)請參考官方文檔:https://docs.djangoproject.com/zh-hans/2.2/ref/models/fields/
3. 模型中Meta配置
對于一些模型級別的配置婴氮。我們可以在模型中定義一個類斯棒,叫做Meta。然后在這個類中添加一些類屬性來控制模型的作用主经。比如我們想要在數(shù)據(jù)庫映射的時候使用自己指定的表名荣暮,而不是使用模型的名稱。那么我們可以在Meta類中添加一個db_table的屬性罩驻。
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,name='description',db_column="description1")
class Meta:
db_table = 'book_model'
1. db_table
這個模型映射到數(shù)據(jù)庫中的表名穗酥。如果沒有指定這個參數(shù),那么在映射的時候?qū)褂媚P兔麃碜鳛槟J(rèn)的表名惠遏。
2. ordering
設(shè)置在提取數(shù)據(jù)的排序方式砾跃。比如我想在查找數(shù)據(jù)的時候根據(jù)添加的時間排序
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,name='description',db_column="description1")
pub_date = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'book_model'
ordering = ['pub_date'] # 正序
ordering = ['-pub_date'] # 倒序
3.verbose_name
設(shè)置在django后臺管理 admin 中顯示的中文名稱
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,name='description',db_column="description1")
pub_date = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'book_model'
ordering = ['pub_date'] # 正序
ordering = ['-pub_date'] # 倒序
verbose_name = '圖書信息'
verbose_name_plural = verbose_name
4. 外鍵和表關(guān)系
在MySQL中,表有兩種引擎爽哎,一種是InnoDB蜓席,另外一種是myisam。如果使用的是InnoDB引擎课锌,是支持外鍵約束的厨内。外鍵的存在使得ORM框架在處理表關(guān)系的時候異常的強大。因此這里我們首先來介紹下外鍵在Django中的使用渺贤。
類定義為class ForeignKey(to,on_delete,**options)雏胃。第一個參數(shù)是引用的是哪個模型,第二個參數(shù)是在使用外鍵引用的模型數(shù)據(jù)被刪除了志鞍,這個字段該如何處理瞭亮,比如有CASCADE、SET_NULL等固棚。這里以一個實際案例來說明统翩。比如有一個Category和一個Article兩個模型。一個Category可以有多個文章此洲,一個Article只能有一個Category厂汗,并且通過外鍵進行引用。
class Category(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
# author = models.ForeignKey("User",on_delete=models.CASCADE)
category = models.ForeignKey("Category",on_delete=models.CASCADE)
以上使用ForeignKey來定義模型之間的關(guān)系呜师。即在article的實例中可以通過author屬性來操作對應(yīng)的User模型娶桦。這樣使用起來非常的方便。
from django.shortcuts import render
from django.http import HttpResponse
from .models import Article,Category
# Create your views here.
def index(request):
category = Category(name="news")
category.save()
article = Article(title='PHP',content='123')
article.category = category
article.save()
article = Article.objects.first()
# 獲取文章分類名稱
article = Article.objects.first()
print(article.category.name)
為什么使用了ForeignKey后,就能通過author訪問到對應(yīng)的user對象呢衷畦。因此在底層栗涂,Django為Article表添加了一個屬性名_id的字段(比如author的字段名稱是author_id),這個字段是一個外鍵祈争,記錄著對應(yīng)的作者的主鍵斤程。以后通過article.author訪問的時候,實際上是先通過author_id找到對應(yīng)的數(shù)據(jù)铛嘱,然后再提取User表中的這條數(shù)據(jù)暖释,形成一個模型。
如果想要引用另外一個app的模型墨吓,那么應(yīng)該在傳遞to參數(shù)的時候,使用app.model_name進行指定纹磺。以上例為例帖烘,如果User和Article不是在同一個app中
# User模型在user這個app中
class User(models.Model):
username = models.CharField(max_length=20)
password = models.CharField(max_length=100)
# Article模型在article這個app中
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.ForeignKey("user.User",on_delete=models.CASCADE)
如果模型的外鍵引用的是本身自己這個模型,那么to參數(shù)可以為'self'橄杨,或者是這個模型的名字秘症。在論壇開發(fā)中,一般評論都可以進行二級評論式矫,即可以針對另外一個評論進行評論乡摹,那么在定義模型的時候就需要使用外鍵來引用自身
class Comment(models.Model):
content = models.TextField()
origin_comment = models.ForeignKey('self',on_delete=models.CASCADE,null=True)
# 或者
# origin_comment = models.ForeignKey('Comment',on_delete=models.CASCADE,null=True)
4.1 外鍵刪除操作
如果一個模型使用了外鍵。那么在對方那個模型被刪掉后采转,該進行什么樣的操作聪廉。可以通過on_delete來指定故慈“逍埽可以指定的類型如下:
1.CASCADE:級聯(lián)操作。如果外鍵對應(yīng)的那條數(shù)據(jù)被刪除了察绷,那么這條數(shù)據(jù)也會被刪除干签。
2.PROTECT:受保護。即只要這條數(shù)據(jù)引用了外鍵的那條數(shù)據(jù)拆撼,那么就不能刪除外鍵的那條數(shù)據(jù)容劳。
3.SET_NULL:設(shè)置為空。如果外鍵的那條數(shù)據(jù)被刪除了闸度,那么在本條數(shù)據(jù)上就將這個字段設(shè)置為空竭贩。如果設(shè)置這個選項,前提是要指定這個字段可以為空筋岛。
4.SET_DEFAULT:設(shè)置默認(rèn)值娶视。如果外鍵的那條數(shù)據(jù)被刪除了,那么本條數(shù)據(jù)上就將這個字段設(shè)置為默認(rèn)值。如果設(shè)置這個選項肪获,前提是要指定這個字段一個默認(rèn)值寝凌。
5.SET():如果外鍵的那條數(shù)據(jù)被刪除了。那么將會獲取SET函數(shù)中的值來作為這個外鍵的值孝赫。SET函數(shù)可以接收一個可以調(diào)用的對象(比如函數(shù)或者方法)较木,如果是可以調(diào)用的對象,那么會將這個對象調(diào)用后的結(jié)果作為值返回回去青柄。
6.DO_NOTHING:不采取任何行為伐债。一切全看數(shù)據(jù)庫級別的約束。
以上這些選項只是Django級別的致开,數(shù)據(jù)級別依舊是RESTRICT峰锁!