1. django中的常用字段
1. AutoField
映射到數(shù)據(jù)庫中是int類型,可以有自動(dòng)增長的特性。一般不需要使用這個(gè)類型,如果不指定主鍵,那么模型會(huì)自動(dòng)的生成一個(gè)叫做id的自動(dòng)增長的主鍵。如果你想指定一個(gè)其他名字的并且具有自動(dòng)增長的主鍵,使用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層面就是普通的字符串。這個(gè)類型在使用的時(shí)候必須要指定最大的長度(max_lenth),也即必須要傳遞max_length這個(gè)關(guān)鍵字參數(shù)進(jìn)去。
(choice = )
最大長度計(jì)算:https://www.cnblogs.com/canger/p/9850727.html
5. DateTimeField
日期時(shí)間類型,不僅僅可以存儲(chǔ)日期,還可以存儲(chǔ)時(shí)間。映射到數(shù)據(jù)庫中是datetime類型。
在django中是有時(shí)區(qū)的概念的,使用時(shí)要考慮到時(shí)區(qū)的問題,默認(rèn)使用的是 UTC時(shí)區(qū),分為 navie(沒時(shí)區(qū)) 和 aware(有時(shí)區(qū)),如果項(xiàng)目不是國際的,可以我們將時(shí)區(qū)關(guān)閉,使用本地的時(shí)間。
我們可以在settings.py 中修改相應(yīng)的時(shí)區(qū)和是否使用時(shí)區(qū)
TIME_ZONE = 'Asia/Shanghai'
USE_TZ= True # 為True意味在項(xiàng)目中使用的是 aware 時(shí)間,如果為false則意味著使用的是 navie 時(shí)間
TIME_ZONE = 'Asia/Shanghai'
from django.utils.timezone import localtime,now
auto_now:在每次這個(gè)數(shù)據(jù)保存的時(shí)候,都使用當(dāng)前的時(shí)間。
比如作為一個(gè)記錄修改日期的字段,可以將這個(gè)屬性設(shè)置為True。
auto_now_add:在每次數(shù)據(jù)第一次被添加進(jìn)去的時(shí)候,都使用當(dāng)前的時(shí)間。
比如作為一個(gè)記錄第一次入庫的字段,可以將這個(gè)屬性設(shè)置為True。
6. EmailField
類似于CharField。在數(shù)據(jù)庫底層也是一個(gè)varchar類型。最大長度是254個(gè)字符。
7. FileField
用來存儲(chǔ)文件的。(upload_to= )指定存儲(chǔ)到哪個(gè)目錄下
8. ImageField
用來存儲(chǔ)圖片文件的。(upload_to= )指定存儲(chǔ)到哪個(gè)目錄下
9. FloatField
浮點(diǎn)類型。映射到數(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
只能存儲(chǔ)uuid格式的字符串。uuid是一個(gè)32位的全球唯一的字符串,一般用來作為主鍵。
17. URLField
類似于CharField,只不過只能用來存儲(chǔ)url格式的字符串。并且默認(rèn)的max_length是200。
2. 字段中的常用屬性
1. null
如果設(shè)置為True,Django將會(huì)在映射表的時(shí)候指定是否為空。默認(rèn)是為False。在使用字符串相關(guān)的Field(CharField/TextField)的時(shí)候,官方推薦盡量不要使用這個(gè)參數(shù),也就是保持默認(rèn)值False。因?yàn)镈jango在處理字符串相關(guān)的Field的時(shí)候,即使這個(gè)Field的null=False,如果你沒有給這個(gè)Field傳遞任何值,那么Django也會(huì)使用一個(gè)空的字符串""來作為默認(rèn)值存儲(chǔ)進(jìn)去。因此如果再使用null=True,Django會(huì)產(chǎn)生兩種空值的情形(NULL或者空字符串)。如果想要在表單驗(yàn)證的時(shí)候允許這個(gè)字符串為空,那么建議使用blank=True。如果你的Field是BooleanField,那么對應(yīng)的可空的字段則為NullBooleanField。
2. db_column
這個(gè)字段在數(shù)據(jù)庫中的名字。如果沒有設(shè)置這個(gè)參數(shù),那么將會(huì)使用模型中屬性的名字。
3. default
默認(rèn)值??梢詾橐粋€(gè)值,或者是一個(gè)函數(shù),但是不支持lambda表達(dá)式。并且不支持列表/字典/集合等可變的數(shù)據(jù)結(jié)構(gòu)。
4. primary_key
是否為主鍵。默認(rèn)是False。
5. unique
在表中這個(gè)字段的值是否唯一。一般是設(shè)置手機(jī)號碼/郵箱等。
更多Field參數(shù)請參考官方文檔:https://docs.djangoproject.com/zh-hans/2.2/ref/models/fields/
3. 模型中Meta配置
對于一些模型級別的配置。我們可以在模型中定義一個(gè)類,叫做Meta。然后在這個(gè)類中添加一些類屬性來控制模型的作用。比如我們想要在數(shù)據(jù)庫映射的時(shí)候使用自己指定的表名,而不是使用模型的名稱。那么我們可以在Meta類中添加一個(gè)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
這個(gè)模型映射到數(shù)據(jù)庫中的表名。如果沒有指定這個(gè)參數(shù),那么在映射的時(shí)候?qū)?huì)使用模型名來作為默認(rèn)的表名。
2. ordering
設(shè)置在提取數(shù)據(jù)的排序方式。比如我想在查找數(shù)據(jù)的時(shí)候根據(jù)添加的時(shí)間排序
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后臺(tái)管理 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)系的時(shí)候異常的強(qiáng)大。因此這里我們首先來介紹下外鍵在Django中的使用。
類定義為class ForeignKey(to,on_delete,**options)。第一個(gè)參數(shù)是引用的是哪個(gè)模型,第二個(gè)參數(shù)是在使用外鍵引用的模型數(shù)據(jù)被刪除了,這個(gè)字段該如何處理,比如有CASCADE、SET_NULL等。這里以一個(gè)實(shí)際案例來說明。比如有一個(gè)Category和一個(gè)Article兩個(gè)模型。一個(gè)Category可以有多個(gè)文章,一個(gè)Article只能有一個(gè)Category,并且通過外鍵進(jìn)行引用。
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的實(shí)例中可以通過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表添加了一個(gè)屬性名_id的字段(比如author的字段名稱是author_id),這個(gè)字段是一個(gè)外鍵,記錄著對應(yīng)的作者的主鍵。以后通過article.author訪問的時(shí)候,實(shí)際上是先通過author_id找到對應(yīng)的數(shù)據(jù),然后再提取User表中的這條數(shù)據(jù),形成一個(gè)模型。
如果想要引用另外一個(gè)app的模型,那么應(yīng)該在傳遞to參數(shù)的時(shí)候,使用app.model_name進(jìn)行指定。以上例為例,如果User和Article不是在同一個(gè)app中
# User模型在user這個(gè)app中
class User(models.Model):
username = models.CharField(max_length=20)
password = models.CharField(max_length=100)
# Article模型在article這個(gè)app中
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.ForeignKey("user.User",on_delete=models.CASCADE)
如果模型的外鍵引用的是本身自己這個(gè)模型,那么to參數(shù)可以為'self',或者是這個(gè)模型的名字。在論壇開發(fā)中,一般評論都可以進(jìn)行二級評論,即可以針對另外一個(gè)評論進(jìn)行評論,那么在定義模型的時(shí)候就需要使用外鍵來引用自身
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 外鍵刪除操作
如果一個(gè)模型使用了外鍵。那么在對方那個(gè)模型被刪掉后,該進(jìn)行什么樣的操作??梢酝ㄟ^on_delete來指定??梢灾付ǖ念愋腿缦拢?/p>
1.CASCADE:級聯(lián)操作。如果外鍵對應(yīng)的那條數(shù)據(jù)被刪除了,那么這條數(shù)據(jù)也會(huì)被刪除。
2.PROTECT:受保護(hù)。即只要這條數(shù)據(jù)引用了外鍵的那條數(shù)據(jù),那么就不能刪除外鍵的那條數(shù)據(jù)。
3.SET_NULL:設(shè)置為空。如果外鍵的那條數(shù)據(jù)被刪除了,那么在本條數(shù)據(jù)上就將這個(gè)字段設(shè)置為空。如果設(shè)置這個(gè)選項(xiàng),前提是要指定這個(gè)字段可以為空。
4.SET_DEFAULT:設(shè)置默認(rèn)值。如果外鍵的那條數(shù)據(jù)被刪除了,那么本條數(shù)據(jù)上就將這個(gè)字段設(shè)置為默認(rèn)值。如果設(shè)置這個(gè)選項(xiàng),前提是要指定這個(gè)字段一個(gè)默認(rèn)值。
5.SET():如果外鍵的那條數(shù)據(jù)被刪除了。那么將會(huì)獲取SET函數(shù)中的值來作為這個(gè)外鍵的值。SET函數(shù)可以接收一個(gè)可以調(diào)用的對象(比如函數(shù)或者方法),如果是可以調(diào)用的對象,那么會(huì)將這個(gè)對象調(diào)用后的結(jié)果作為值返回回去。
6.DO_NOTHING:不采取任何行為。一切全看數(shù)據(jù)庫級別的約束。
以上這些選項(xiàng)只是Django級別的,數(shù)據(jù)級別依舊是RESTRICT!