Django中ORM外键与表的关系是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
<强>外键强>
在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是InnoDB引擎,是支持外键约束的。外键的存在使得ORM框架在处理表关系的时候异常的强大,因此这里我们首先来介绍下外键在Django中的使用。
类定义为类ForeignKey (on_delete, * *选项)。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有级联,SET_NULL等。这里以一个实际案例来说明。比如有一个用户和一个文章两个模型。一个用户可以发表多篇文章,一个文章只能有一个作者,并且通过外键进行引用。那么相关的示例代码如下:
class 用户(models.Model): 时间=username 才能;models.CharField (max_length=20) 时间=password 才能;models.CharField (max_length=100) class 文章(models.Model): 时间=title 才能;models.CharField (max_length=100) 时间=content 才能;models.TextField () author 才能=,models.ForeignKey (“User", on_delete=models.CASCADE)
以上使用ForeignKey来定义模型之间的关系。即在文章的实例中可以通过作者属性来操作对应的用户模型。这样使用起来非常的方便。示例代码如下:
article =,文章(标题=& # 39;abc # 39;,内容=& # 39;123 & # 39;) 时间=author 用户(用户名=& # 39;张三& # 39;,密码=& # 39;111111 & # 39;) 时间=article.author 作者 article.save () #,修改article.author上的值 时间=article.author.username & # 39;李四& # 39; article.save ()
为什么使用了ForeignKey后,就能通过作者访问到对应的用户对象呢。因此在底层,Django表为文章添加了一个属性名_id的字段(比如作者的字段名称是author_id),这个字段是一个外键,记录着对应的作者的主键。以后通过文章。作者访问的时候,实际上是先通过author_id找到对应的数据,然后再提取用户表中的这条数据,形成一个模型。
如果想要引用另外一个应用的模型,那么应该在传递到参数的时候,使用app.model_name进行指定。以上例为例,如果用户和文章不是在同一个应用程序中,那么在引用的时候的示例代码如下:
#,用户模型在用户这个应用程序中 class 用户(models.Model): 时间=username 才能;models.CharField (max_length=20) 时间=password 才能;models.CharField (max_length=100) #,模条型在这条个应用程序中 class 文章(models.Model): 时间=title 才能;models.CharField (max_length=100) 时间=content 才能;models.TextField () author 才能=,models.ForeignKey (“user.User", on_delete=models.CASCADE)
如果模型的外键引用的是本身自己这个模型,那么,参数可以为& # 39;自我# 39;,或者是这个模型的名字。在论坛开发中,一般评论都可以进行二级评论,即可以针对另外一个评论进行评论,那么在定义模型的时候就需要使用外键来引用自身。示例代码如下:
class 评论(models.Model): 时间=content 才能;models.TextField () origin_comment 才能=,models.ForeignKey(& # 39;自我# 39;,on_delete=models.CASCADE null=True) #才能,或者 #,才能origin_comment =, models.ForeignKey(& # 39;评论# 39;,on_delete=models.CASCADE null=True)
<强>外键删除操作:强>
如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过> <李>
级联:级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。
李> <李>保护:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。
李> <李>SET_NULL:设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。
李> <李>SET_DEFAULT:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。
李> <李>设置():如果外键的那条数据被删除了。那么将会获取一组函数中的值来作为这个外键的值,设置函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。