外键
在 MySQL 中,表有两种引擎,一种是 InnoDB,另外一种是myisam。如果使用的是 InnoDB 引擎,是支持外键约束的。
类定义为 class ForeignKey(to,on_delete,**options) 。
第一个参数是引用的是哪个模型(也就是哪一张表)
第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理。
代码示例:
class User(models.Model):
username = models.CharField(max_length=20)
password = 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)
查看表的时候会发现,Django会根据字段名字(即author)加上下划线("_id")来指示引用的另一张表的id
以上使用的是ForeignKey来定义模型之间的关系。
使用外键
示例代码
def index(request): article = Article(title = 'abc',content = '123') author = User(username = '张三', password = '123456') article.author = author #第一个author指的是外键的那个字段(即模型类的author)第二个author指的是定义的对象(即上一行的author)。 article.save() #修改aritcle.author上的值 article.author.username = '李四' article.save()
Django 为 Article 表添加了一个属性名_id的字段(比如author的字段名称是author_id),这个字段是一个外键,记录着对应的作者的主键。以后通过 article.author 访问的时候,实际上是先通过author_id 找到对应的数据,然后再提取 User 表中的这条数据,形成一个模型。
外键引用其他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)