## 外鍵和表關系
在MySQL中,表有兩種引擎,一種是InnoDB,另外一種是myisam。如果使用的是InnoDB引擎,是支持外鍵約束的。外鍵的存在使得ORM框架在處理表關系的時候異常的強大。因此這里我們首先來介紹下外鍵在Django中的使用。
類定義為class ForeignKey(to,on_delete,**options)。第一個參數是引用的是哪個模型,第二個參數是在使用外鍵引用的模型數據被刪除了,這個字段該如何處理,比如有CASCADE、SET_NULL等。這里以一個實際案例來說明。比如有一個Category和一個Article兩個模型。一個Category可以有多個文章,一個Article只能有一個Category,并且通過外鍵進行引用。
```
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來定義模型之間的關系。即在article的實例中可以通過author屬性來操作對應的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訪問到對應的user對象呢。因此在底層,Django為Article表添加了一個屬性名_id的字段(比如author的字段名稱是author_id),這個字段是一個外鍵,記錄著對應的作者的主鍵。以后通過article.author訪問的時候,實際上是先通過author_id找到對應的數據,然后再提取User表中的這條數據,形成一個模型。
如果想要引用另外一個app的模型,那么應該在傳遞to參數的時候,使用app.model_name進行指定。以上例為例,如果User和Article不是在同一個app中
```
# User模型在user這個app中
class User(models.Model):
username = models.CharField(max_length=20)
password = models.CharField(max_length=100)
# Article模型在article這個app中
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.ForeignKey("user.User",on_delete=models.CASCADE)
```
如果模型的外鍵引用的是本身自己這個模型,那么to參數可以為'self',或者是這個模型的名字。在論壇開發中,一般評論都可以進行二級評論,即可以針對另外一個評論進行評論,那么在定義模型的時候就需要使用外鍵來引用自身
```
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)
```
### 外鍵刪除操作
```
如果一個模型使用了外鍵。那么在對方那個模型被刪掉后,該進行什么樣的操作。可以通過on_delete來指定。可以指定的類型如下:
1.CASCADE:級聯操作。如果外鍵對應的那條數據被刪除了,那么這條數據也會被刪除。
2.PROTECT:受保護。即只要這條數據引用了外鍵的那條數據,那么就不能刪除外鍵的那條數據。
3.SET_NULL:設置為空。如果外鍵的那條數據被刪除了,那么在本條數據上就將這個字段設置為空。如果設置這個選項,前提是要指定這個字段可以為空。
4.SET_DEFAULT:設置默認值。如果外鍵的那條數據被刪除了,那么本條數據上就將這個字段設置為默認值。如果設置這個選項,前提是要指定這個字段一個默認值。
5.SET():如果外鍵的那條數據被刪除了。那么將會獲取SET函數中的值來作為這個外鍵的值。SET函數可以接收一個可以調用的對象(比如函數或者方法),如果是可以調用的對象,那么會將這個對象調用后的結果作為值返回回去。
6.DO_NOTHING:不采取任何行為。一切全看數據庫級別的約束。
```
**以上這些選項只是Django級別的,數據級別依舊是RESTRICT!**
- 空白目錄
- 1-Django前導知識
- 1-1-虛擬環境
- 1-2-Django框架介紹與環境搭建
- 2-URL與視圖
- 2-1-URL與視圖
- 3-模板
- 3-1-模板介紹
- 3-2-模板變量
- 3-3-常用標簽
- 3-4-模板常用過濾器
- 3-5-模板結構優化
- 3-6-加載靜態文件
- 4-數據庫
- 4-1-操作數據庫
- 4-2-圖書管理系統
- 4-3-ORM模型介紹
- 4-4-ORM模型的增刪改查
- 4-5-模型常用屬性
- 4-6-外鍵和表
- 4-7-查詢操作
- 4-8-QuerySet的方法
- 4-9-ORM模型練習
- 4-10-ORM模型遷移
- 5-視圖高級
- 1-Django限制請求method
- 2-頁面重定向
- 3-HttpRequest對象
- 4-HttpResponse對象
- 5-類視圖
- 6-錯誤處理
- 6-表單
- 1-用表單驗證數據
- 2-ModelForm
- 3-文件上傳
- 7-session和cookie
- 1-session和cookie
- 8-memcached
- 1-memcached
- 9-阿里云部署
- 阿里云部署