zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    一直追求技术好吗?
    设计模式前言
    vba 行 列 单元格 统计
    JavaScript 仿LightBox内容显示效果
    Excel 比大小
    多态
    JavaScript 图片切换展示效果
    vba 单元格 一系例操作
    关于Flex的争论(富客户端、弱客户端)
    input文本框样式代码实例
  • 原文地址:https://www.cnblogs.com/jiajiaba/p/10605634.html
Copyright © 2011-2022 走看看