91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

django外鍵賦值的方法

發布時間:2020-08-13 14:27:18 來源:億速云 閱讀:817 作者:小新 欄目:編程語言

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

在寫項目的過程中我們不可避免的會使用到外鍵這個東西,那么Django中是怎樣來使用外鍵的呢?

了解外鍵

MySQL中,表有兩種引擎,一種是InnoDB,另外一種是myisam。如果使用的是InnoDB引擎,是支持外鍵約束的。外鍵的存在使得ORM框架在處理表關系的時候異常的強大。MySQL數據庫默認使用的也是InnoDB引擎。

使用外鍵

新建一個項目,創建一個article的app,添加至settings中,并且在settings中設置數據庫的連接,調至整個項目能運行為止。

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

1. 在同一個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中設置了一個外鍵category。

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

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

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

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

在上面代碼中把相應的注釋去了,就能夠進行測試了。

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

如果想要引用另外一個app的模型,那么應該在傳遞to參數的時候,使用app.model_name進行指定。例如,如果User和Article不是在同一個app中,那么在引用的時候的示例代碼如下:

首先新建一個user的app,并且添加至settings中,在user中的models中寫入代碼,創建一個User模型

from django.db import models

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

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

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

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

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

這樣我們就實現了添加了一個外鍵引用自身。

外間刪除操作的參數意思:

如果一個模型使用了外鍵。那么在對方那個模型被刪掉后,該進行什么樣的操作。可以通過on_delete來指定。可以指定的類型如下:

CASCADE:級聯操作。如果外鍵對應的那條數據被刪除了,那么這條數據也會被刪除。

PROTECT:受保護。即只要這條數據引用了外鍵的那條數據,那么就不能刪除外鍵的那條數據。如果我們強行刪除,Django就會報錯。

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

SET_DEFAULT:設置默認值。如果外鍵的那條數據被刪除了,那么本條數據上就將這個字段設置為默認值。如果設置這個選項,== 前提是要指定這個字段一個默認值 ==。

SET():如果外鍵的那條數據被刪除了。那么將會獲取SET函數中的值來作為這個外鍵的值。SET函數可以接收一個可以調用的對象(比如函數或者方法),如果是可以調用的對象,那么會將這個對象調用后的結果作為值返回回去。== 可以不用指定默認值 ==

DO_NOTHING:不采取任何行為。一切全看數據庫級別的約束。

以上這些選項只是Django級別的,數據級別依舊是RESTRICT!

數據庫層面的約束有四種:

RESTRICT:默認的選項,如果想要刪除父表的記錄時,而在子表中有關聯該父表的記錄,則不允許刪除父表中的記錄;

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

CASCADE:父表delete、update的時候,子表會delete、update掉關聯記錄;

SET NULL:父表delete、update的時候,子表會將關聯記錄的外鍵字段所在列設為null,所以注意在設計子表時外鍵不能設為not null。

關于django外鍵賦值的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

无锡市| 牟定县| 抚远县| 巴青县| 东安县| 介休市| 闽清县| 勃利县| 西华县| 余姚市| 海盐县| 秦皇岛市| 葫芦岛市| 嫩江县| 曲阳县| 华蓥市| 阿城市| 华坪县| 临清市| 林周县| 乐清市| 丰顺县| 壶关县| 孝昌县| 威远县| 如皋市| 庆云县| 旬阳县| 久治县| 云林县| 北川| 伽师县| 苗栗县| 右玉县| 宜君县| 紫阳县| 剑河县| 桐城市| 长子县| 平南县| 鄂尔多斯市|