Django中外鍵使用總結(jié)

目錄

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

了解外鍵

在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í)際案例來(lái)說(shuō)明。比如有一個(gè)Category和一個(gè)Article兩個(gè)模型。一個(gè)種類下可以包含多篇內(nèi)容,一個(gè)Article只能有一個(gè)種類,并且通過(guò)外鍵進(jìn)行引用。那么相關(guān)得示例代碼如下:

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

在article中得models中寫(xiě)入代碼:

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來(lái)定義模型之間得關(guān)系。即在article得實(shí)例中可以通過(guò)category屬性來(lái)操作對(duì)應(yīng)得Category模型。這樣使用起來(lái)非常得方便。示例代碼如下:views中寫(xiě)入

from django.shortcuts import renderfrom . import modelsfrom django.http import HttpResponse# Create your views here.def index(request):? ??? ? # 插入數(shù)據(jù)? ? # article = models.Article(title='abc',content='111')? ? # category = models.Category(name='最新內(nèi)容')? ? # 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后,就能通過(guò)category訪問(wèn)到對(duì)應(yīng)得Catrgory對(duì)象呢。因此在底層,Django為Article表添加了一個(gè)屬性名_id得字段(比如category得字段名稱是category_id),這個(gè)字段是一個(gè)外鍵,記錄著對(duì)應(yīng)得種類得主鍵。以后通過(guò)article.category訪問(wèn)得時(shí)候,實(shí)際上是先通過(guò)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中寫(xiě)入代碼,創(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è)屬性

# 將user中得User這個(gè)模型作為外鍵author = models.ForeignKey('user.User',on_delete=models.CASCADE,null=True)

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

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)行什么樣得操作。可以通過(guò)on_delete來(lái)指定。可以指定得類型如下:

  • 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ù)中得值來(lái)作為這個(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;

參考鏈接:https://www.jb51.net/article/257166.htm

為什么ORM能越過(guò)數(shù)據(jù)庫(kù)得約束呢?

是因?yàn)镺RM操作是反過(guò)來(lái)得,比如我們?cè)贠RM模型中設(shè)置了on_delete=models.CASCADE,那么在進(jìn)行刪除得時(shí)候,如果發(fā)現(xiàn)在數(shù)據(jù)庫(kù)層面有父表約束著它,使他不能被刪除,那么ORM就會(huì)先去刪除父表,再來(lái)刪除指定得表,從而達(dá)到越過(guò)了數(shù)據(jù)庫(kù)層面得約束。

到此這篇關(guān)于Django中外鍵使用總結(jié)得內(nèi)容就介紹到這了,更多相關(guān)Django 外鍵內(nèi)容請(qǐng)搜索之家以前得內(nèi)容或繼續(xù)瀏覽下面得相關(guān)內(nèi)容希望大家以后多多支持之家!

聲明:所有內(nèi)容來(lái)自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準(zhǔn)確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。
發(fā)表評(píng)論
更多 網(wǎng)友評(píng)論1 條評(píng)論)
暫無(wú)評(píng)論

返回頂部

主站蜘蛛池模板: 够爽影院vip破解版| 中国熟妇xxxx| 亚洲乱码无码永久不卡在线| 成人激情免费视频| 最近免费中文字幕大全高清大全1 最近免费中文字幕大全高清大全1 | a级黄色毛片视频| 中文字幕一区二区视频| 九九视频九九热| 亚洲国产精品综合一区在线| 八戒网站免费观看视频| 国产裸模视频免费区无码 | 欧美日韩免费播放一区二区| 精品人人妻人人澡人人爽人人| 韩国电影中文字幕| jizzyou中国少妇| 一本久久综合亚洲鲁鲁五月天 | 国产成人精品亚洲| 国产精品99久久久久久董美香 | 久久亚洲精品中文字幕三区| 再深点灬舒服灬太大了网站| 国产18禁黄网站免费观看| 国产伦精品一区二区三区四区 | youjizz国产| 一本大道久久东京热无码AV| 丰满的寡妇3在线观看| 久久久国产精品无码免费专区| 久热精品视频在线观看99小说| 亚洲av无码片一区二区三区| 亚洲av无码一区二区三区观看| 亚洲伊人久久大香线蕉综合图片 | 内射极品少妇XXXXXHD| 免费精品99久久国产综合精品 | 欧美成视频无需播放器| 狠狠色伊人亚洲综合网站色| 国产交换丝雨巅峰| 钻胯羞辱的视频vk| 色av.com| 男女做爽爽视频免费观看| 热99re久久精品精品免费| 美国十次狠狠色综合av| 精品国产三级a∨在线观看|