• 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)
  • 相关阅读:
    ANDROID STUDIO系列教程一--下载与安装
    Linux发邮件之mail命令
    Linux/CentOS关闭图形界面(X-window)和启用图形界面命令
    SVN四部曲之SVN设置详解深入
    构造函数 (C++)
    C++的构造函数和析构函数
    当你输入一个网址的时候,实际会发生什么?
    C++ 风格与技术 FAQ(中文版)
    二分查找算法(递归与非递归两种方式)
    c++模板
  • 原文地址:https://www.cnblogs.com/jiajiaba/p/10605634.html
Copyright © 2020-2023  润新知