django外鍵賦值的方法

這篇文章將為大家詳細(xì)講解有關(guān)django外鍵賦值的方法,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)公司專注于撫遠(yuǎn)企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),成都做商城網(wǎng)站。撫遠(yuǎn)網(wǎng)站建設(shè)公司,為撫遠(yuǎn)等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站建設(shè),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

在寫項(xiàng)目的過程中我們不可避免的會(huì)使用到外鍵這個(gè)東西,那么Django中是怎樣來使用外鍵的呢?

了解外鍵

在MySQL中,表有兩種引擎,一種是InnoDB,另外一種是myisam。如果使用的是InnoDB引擎,是支持外鍵約束的。外鍵的存在使得ORM框架在處理表關(guān)系的時(shí)候異常的強(qiáng)大。MySQL數(shù)據(jù)庫(kù)默認(rèn)使用的也是InnoDB引擎。

使用外鍵

新建一個(gè)項(xiàng)目,創(chuàng)建一個(gè)article的app,添加至settings中,并且在settings中設(shè)置數(shù)據(jù)庫(kù)的連接,調(diào)至整個(gè)項(xiàng)目能運(yùn)行為止。

類定義為class ForeignKey(to,on_delete,**options)。第一個(gè)參數(shù)是引用的是哪個(gè)模型,第二個(gè)參數(shù)是在使用外鍵引用的模型數(shù)據(jù)被刪除了,這個(gè)字段該如何處理,比如有CASCADE、SET_NULL等(外鍵刪除各個(gè)參數(shù)的意思)。這里以一個(gè)實(shí)際案例來說明。比如有一個(gè)Category和一個(gè)Article兩個(gè)模型。一個(gè)種類下可以包含多篇文章,一個(gè)Article只能有一個(gè)種類,并且通過外鍵進(jìn)行引用。那么相關(guān)的示例代碼如下:

1. 在同一個(gè)app中使用外鍵

在article中的models中寫入代碼:

from django.db import models

# Create your models here.
class Category(models.Model):
    name = models.CharField(max_length=100)

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    # 是由Category影響Article
    category = models.ForeignKey('Category',on_delete=models.CASCADE)

這里我們就在Article中設(shè)置了一個(gè)外鍵category。

以上使用ForeignKey來定義模型之間的關(guān)系。即在article的實(shí)例中可以通過category屬性來操作對(duì)應(yīng)的Category模型。這樣使用起來非常的方便。示例代碼如下:views中寫入

from django.shortcuts import render
from . import models
from django.http import HttpResponse

# Create your views here.
def index(request):
    
    # 插入數(shù)據(jù)
    # article = models.Article(title='abc',content='111')
    # category = models.Category(name='最新文章')
    # category.save()
    # article.category = category
    # article.save()

    #讀取數(shù)據(jù)
    article = models.Article.objects.first()
    print(article.category.name)
    return HttpResponse('successful')

在上面代碼中把相應(yīng)的注釋去了,就能夠進(jìn)行測(cè)試了。

為什么使用了ForeignKey后,就能通過category訪問到對(duì)應(yīng)的Catrgory對(duì)象呢。因此在底層,Django為Article表添加了一個(gè)屬性名_id的字段(比如category的字段名稱是category_id),這個(gè)字段是一個(gè)外鍵,記錄著對(duì)應(yīng)的種類的主鍵。以后通過article.category訪問的時(shí)候,實(shí)際上是先通過category_id找到對(duì)應(yīng)的數(shù)據(jù),然后再提取Category表中的這條數(shù)據(jù),形成一個(gè)模型。

如果想要引用另外一個(gè)app的模型,那么應(yīng)該在傳遞to參數(shù)的時(shí)候,使用app.model_name進(jìn)行指定。例如,如果User和Article不是在同一個(gè)app中,那么在引用的時(shí)候的示例代碼如下:

首先新建一個(gè)user的app,并且添加至settings中,在user中的models中寫入代碼,創(chuàng)建一個(gè)User模型

from django.db import models

# Create your models here.
class User(models.Model):
    username = models.CharField(max_length=100)

再在article中的models中添加這個(gè)外鍵,即在Article這個(gè)模型中新添加一個(gè)屬性

author = models.ForeignKey('user.User',on_delete=models.CASCADE,null=True)

如果模型的外鍵引用的是本身自己這個(gè)模型,那么to參數(shù)可以為self,或者是這個(gè)模型的名字。在論壇開發(fā)中,一般評(píng)論都可以進(jìn)行二級(jí)評(píng)論,即可以針對(duì)另外一個(gè)評(píng)論進(jìn)行評(píng)論,那么在定義模型的時(shí)候就需要使用外鍵來引用自身。示例代碼如下:

class Comment(models.Model):
    content = models.TextField()
    orihin_comment = models.ForeignKey('self',on_delete=models.CASCADE)

這樣我們就實(shí)現(xiàn)了添加了一個(gè)外鍵引用自身。

外間刪除操作的參數(shù)意思:

如果一個(gè)模型使用了外鍵。那么在對(duì)方那個(gè)模型被刪掉后,該進(jìn)行什么樣的操作??梢酝ㄟ^on_delete來指定??梢灾付ǖ念愋腿缦拢?/p>

CASCADE:級(jí)聯(lián)操作。如果外鍵對(duì)應(yīng)的那條數(shù)據(jù)被刪除了,那么這條數(shù)據(jù)也會(huì)被刪除。

PROTECT:受保護(hù)。即只要這條數(shù)據(jù)引用了外鍵的那條數(shù)據(jù),那么就不能刪除外鍵的那條數(shù)據(jù)。如果我們強(qiáng)行刪除,Django就會(huì)報(bào)錯(cuò)。

SET_NULL:設(shè)置為空。如果外鍵的那條數(shù)據(jù)被刪除了,那么在本條數(shù)據(jù)上就將這個(gè)字段設(shè)置為空。如果設(shè)置這個(gè)選項(xiàng),前提是要指定這個(gè)字段可以為空。

SET_DEFAULT:設(shè)置默認(rèn)值。如果外鍵的那條數(shù)據(jù)被刪除了,那么本條數(shù)據(jù)上就將這個(gè)字段設(shè)置為默認(rèn)值。如果設(shè)置這個(gè)選項(xiàng),== 前提是要指定這個(gè)字段一個(gè)默認(rèn)值 ==。

SET():如果外鍵的那條數(shù)據(jù)被刪除了。那么將會(huì)獲取SET函數(shù)中的值來作為這個(gè)外鍵的值。SET函數(shù)可以接收一個(gè)可以調(diào)用的對(duì)象(比如函數(shù)或者方法),如果是可以調(diào)用的對(duì)象,那么會(huì)將這個(gè)對(duì)象調(diào)用后的結(jié)果作為值返回回去。== 可以不用指定默認(rèn)值 ==

DO_NOTHING:不采取任何行為。一切全看數(shù)據(jù)庫(kù)級(jí)別的約束。

以上這些選項(xiàng)只是Django級(jí)別的,數(shù)據(jù)級(jí)別依舊是RESTRICT!

數(shù)據(jù)庫(kù)層面的約束有四種:

RESTRICT:默認(rèn)的選項(xiàng),如果想要?jiǎng)h除父表的記錄時(shí),而在子表中有關(guān)聯(lián)該父表的記錄,則不允許刪除父表中的記錄;

NOACTION:同 RESTRICT效果一樣,也是首先先檢查外鍵;

CASCADE:父表delete、update的時(shí)候,子表會(huì)delete、update掉關(guān)聯(lián)記錄;

SET NULL:父表delete、update的時(shí)候,子表會(huì)將關(guān)聯(lián)記錄的外鍵字段所在列設(shè)為null,所以注意在設(shè)計(jì)子表時(shí)外鍵不能設(shè)為not null。

關(guān)于django外鍵賦值的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

當(dāng)前標(biāo)題:django外鍵賦值的方法
標(biāo)題鏈接:http://bm7419.com/article22/pssicc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、用戶體驗(yàn)、小程序開發(fā)、全網(wǎng)營(yíng)銷推廣、網(wǎng)站營(yíng)銷、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司