- 在
Mysql
中,表有两种引擎,一种是InnoDB
,另一种是myisam
,如果想要使用外键,需要使用InnoDB
作为引擎。 - 在
Django
中,使用models.ForeignKey(to,on_delete)
来声明外键,第一个参数表示引用了哪个模型,第二个参数设定使用外键引用的模型的数据被删除时的处理原则,如级联原则CASCADE
和置空值原则SET_NULL
,下面创建了两个模型,一个是person app下的Person
,作为被引用对象,然后是article app下的Article
,使用外键引用Person
的主键,示例代码如下:
person/models.py
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=200)
article/models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey('person.Person', on_delete=models.CASCADE)
- 在article实例中,可以通过跟原生python一样的
.
操作来获取外键属性,并进行输出或修改,示例代码如下:
①输出外键的值
from django.http import HttpResponse
from .models import Article
from person.models import Person
def index(request):
person = Person.objects.get(pk=1)
article = Article(title='title', content='content')
article.author = person
article.save()
print(article.author.name)
return HttpResponse('success')
②修改外键的值,这时需要对被引用对象进行save()操作而不是对引用对象save()
from django.http import HttpResponse
from .models import Article
from person.models import Person
def index(request):
person = Person.objects.get(pk=1)
article = Article(title='title', content='content')
article.author = person
article.save()
article.author.name = 'def'
person.save()
return HttpResponse('success')
- 模型的外键还可以把自身作为引用对象,那么
to
参数就要使用self
,或者就是这个模型的名字。在论坛开发中,一般评论都可以进行二级评论,即可以针对另外一个评论进行评论,那么在定义模型的时候就需要使用外键来引用自身。示例代码如下:
class Comment(models.Model):
content = models.TextField()
origin_comment = models.ForeignKey('self', on_delete=models.CASCADE, null=True)