Django 外键

外键

在 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)
    
posted @ 2019-03-27 10:11  苏黎世的从前  阅读(348)  评论(0编辑  收藏  举报