Django 外键

外键

在 MySQL 中,表有两种引擎,一种是 InnoDB,另外一种是myisam。如果使用的是 InnoDB 引擎,是支持外键约束的。

1632913-20190327121656623-917422853.png

类定义为 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)

转载于:https://www.cnblogs.com/jiajiaba/p/10605634.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值