当前位置: 首页 > 后端技术 > Python

DjangoNote6ForeignKey介绍

时间:2023-03-26 11:55:57 Python

本篇笔记介绍了Django系统模型的外键处理,ForeignKey以及对应的处理方法。这是一个一对多的字段类型,表示两个表之间的关系。本笔记的目录如下:on_deleterated_namerelated_query_name外键字段保存1、on_delete假设有两个应用,app1和app2app1下的一个模型是App1,app2下的一个模型是App2#app1/models.pyclassApp1(models.Model):app2=models.ForeignKey("app2.App2",on_delete=models.CASCADE)#app2/models.pyclassApp2(models.Model):pass我们在设置ForeignKey的时候,有一个on_delete参数,主要用在当关联外键的数据被删除时,对其自身数据的处理。在我们上面的两个模型例子中,当App2中的一条数据被删除时,与这条数据关联的App1中的数据的处理方式。处理方式主要有以下几种:CASCADE关联删除,删除App2的数据时,App1关联的数据也会被删除PROTECT保护处理,如果App2的数据关联了App1,那么App2的关联数据也会未删除SET_NULL清空处理,如果删除了App2的数据,App1中与删除的App2数据关联的字段将被设置为NULLDO_NOTHING,不做处理,不对原数据进行任何操作,即比如说,App2中的一条数据会被删除Deleted,App1中的引用还在。但实际上不推荐这样做,因为如果访问App1中的数据,使用字段app2,会报错。2.related_nameForeignKey有一个属性related_name,用来表示related对象到这个对象的关系名称。仅用于显示,但如果没有赋值related_query_name字段,那么related_query_name会默认使用related_name的值。注意:related_name还有另外一个用途,就是在同一个类下,如果两个字段是另一个模型的外键字段,需要加上related_name来区分这两个字段。示例如下:classEntry(models.Model):blog_old=models.ForeignKey(Blog,related_name='old_entry')blog_new=models.ForeignKey(Blog,related_name='new_entry')3.主要使用related_query_name字段用于反向过滤如果该字段不单独赋值,则默认使用related_name的值。关于反向过滤,我们可以看一下这个函数,下面是两个模型:classBlog(models.Model):passclassEntry(models.Model):blog=models.ForeignKey(Blog)现在我们有一个BlogData,blog_1=Blog.objects.get(id=1)如果我们想获取所有Entry表中blog_1的值,如何处理,一般来说:entry_list=Entry.objects.filter(blog=blog_1)但是因为blogfield是外键,我们使用反向过滤器来处理:entry_list=blog_1.entry_set.all()以上是我们反向过滤器的用法,就是使用关联模型名称的小写+'_set'操作,这是一个固定的用法。但是如果我们设置related_query_name字段,就可以放弃使用小写模型名+'_set',直接使用related_query_name进行操作,比如Entry如下:classEntry(models.Model):blog=models.ForeignKey(Blog,related_name="entries")这个时候我们还没有设置related_query_name的值,所以会自动使用related_name的值。反向过滤器的使用方法如下:entry_list=blog_1.entries.all()4.先保存外键字段我们先介绍一下外键字段在数据库和模型中是什么样子的。在模型中,以Entry为例,我们可以看到关键的blog字段直接命名为'blog',但是在数据库结构中,我们查看可以看到该字段是blog_id。当我们得到一个Entry实例时,就是entry_obj,entry_obj=Entry.objects.get(id=1)当我们输出entry_obj.blog时,返回的是一个Blog实例,是一个对象,输出entry_obj.blog_id返回的是一个int类型的数据。那么,我们如何为Entry实例保存博客字段呢?如果我们有一个博客实例为blog_1,我们可以直接使用它:entry_obj.blog=blod_1entry_obj.save()如果我们有一个主键id为blog_id的博客,那么我们可以这样操作:entry_obj.blog_id=blod_identry_obj.save()以上就是我们介绍外键的全部内容了。在接下来的笔记中,我们将介绍ManyToMany和OneToOne的用法。