Django學(xué)習(xí)-第七講:django 中的常用字段、字段屬性,外鍵和表關(guān)系、外鍵操作

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!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容