<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在寫專案的過程中我們不可避免的會使用到外來鍵這個東西,那麼Django中是怎樣來使用外來鍵的呢?
在MySQL中,表有兩種引擎,一種是InnoDB,另外一種是myisam。如果使用的是InnoDB引擎,是支援外來鍵約束的。外來鍵的存在使得ORM框架在處理表關係的時候異常的強大。MySQL資料庫預設使用的也是InnoDB引擎。
新建一個專案,建立一個article的app,新增至settings中,並且在settings中設定資料庫的連線,調至整個專案能執行為止。
類定義為class ForeignKey(to,on_delete,**options)。第一個引數是參照的是哪個模型,第二個引數是在使用外來鍵參照的模型資料被刪除了,這個欄位該如何處理,比如有CASCADE、SET_NULL等(外來鍵刪除各個引數的意思)。這裡以一個實際案例來說明。比如有一個Category和一個Article兩個模型。一個種類下可以包含多篇文章,一個Article只能有一個種類,並且通過外來鍵進行參照。那麼相關的範例程式碼如下:
在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這個模型中新新增一個屬性
# 將user中的User這個模型作為外來鍵 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來指定。可以指定的型別如下:
以上這些選項只是Django級別的,資料級別依舊是RESTRICT!
資料庫層面的約束有四種:
參考連結:https://www.jb51.net/article/257166.htm
為什麼ORM能越過資料庫的約束呢?
是因為ORM操作是反過來的,比如我們在ORM模型中設定了on_delete=models.CASCADE,那麼在進行刪除的時候,如果發現在資料庫層面有父表約束著它,使他不能被刪除,那麼ORM就會先去刪除父表,再來刪除指定的表,從而達到越過了資料庫層面的約束。
到此這篇關於Django中外來鍵使用總結的文章就介紹到這了,更多相關Django 外來鍵內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45