Django中外键ForeignKey介绍使用

目录
  • 1、on_delete
  • 2、related_name
  • 3、related_query_name
  • 4、外键字段的保存

这一篇笔记介绍 Django 系统 model 的外键处理,ForeignKey 以及相应的处理方法。

这是一种一对多的字段类型,表示两张表之间的关联关系。

本篇笔记的目录如下:

  • on_delete
  • related_name
  • related_query_name
  • 外键字段的保存

1、on_delete

假设有两个 application,app1 和 app2

app1 下的 某个 model 为 App1

app2 下的 某个 model 为 App2

# app1/models.py
class App1(models.Model):
    app2 = models.ForeignKey("app2.App2", on_delete=models.CASCADE)
# app2/models.py
class App2(models.Model):
    pass

当我们设置 ForeignKey 的时候,有一个 on_delete 参数,主要用于当被关联的外键的数据被删除时,自身数据的处理。

在我们上面的两个 model 的例子便是,当 App2 的某个数据被删除时,关联了该条数据的 App1 的数据的处理方式。

处理方式主要有以下几种:

CASCADE
关联删除,App2 的数据被删除时,App1 关联的数据也被删除

PROTECT
保护处理,如果 App2 的数据被 App1 关联,那么关联了的 App2 的数据不会被删除

SET_NULL
置空处理,如果 App2 的数据被删除,App1 中关联了该条被删除的App2的数据这个字段都会被设置为 NULL

DO_NOTHING
不处理,原数据不会有任何操作,也就是说 App2 的某条数据被删除,App1 中的引用还在。

但其实这是一种不推荐的做法,因为如果访问到 App1 中的这条数据,用到了 app2 这个字段,就会报错。

2、related_name

ForeignKey 有一个属性,related_name,用于表示从相关对象到此对象的关系的名称,仅用于展示,但是如果 related_query_name 字段没有被赋值的话,那么 related_query_name 则会默认使用 related_name 这个值。

注意: related_name 还有一个用途,就是在同一个 class 下面,如果有两个字段都是另一个 model 的外键字段,这时候添加 related_name 用来区分两个字段是必须的。

示例如下:

class Entry(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 的值。

关于反向过滤器,我们可以来看下这个功能,以下是两个 model:

class Blog(models.Model):
    pass

class Entry(models.Model):
    blog = models.ForeignKey(Blog)

现在我们有一个 Blog 的数据,

blog_1 = Blog.objects.get(id=1)

如果我们想要获取所有 Entry 表里 blog 这个字段的值为 blog_1,怎么处理呢,一般来说是:

entry_list = Entry.objects.filter(blog=blog_1)

但是因为 blog 这个字段是 外键,所以我们使用 反向过滤器 来处理:

entry_list = blog_1.entry_set.all()

上面就是我们 反向过滤器 的用法,就是使用关联的model 的名称的小写 + ‘_set’ 来操作,这是一个固定用法。

但是如果我们设置了 related_query_name 这个字段, model名称小写+’_set’ 的用法就可以废弃了,可以直接使用 related_query_name 来操作,比如 Entry 如下:

class Entry(models.Model):
    blog = models.ForeignKey(Blog, related_name="entries")

这时候,我们没有设置 related_query_name 的值,所以会自动使用 related_name 的值,使用 反向过滤器 的方法如下:

entry_list = blog_1.entries.all()

4、外键字段的保存

首先我们先来介绍一下外键字段在数据库和 model 里的样子。

在 model 里,以 Entry 为例,我们可以看到,关键 blog 字段,直接命名为 ‘blog’,

但是在数据库的结构里,我们去查看的话,可以看到该字段为 blog_id。

当我们获取了一个 Entry 实例,为 entry_obj,

entry_obj = Entry.objects.get(id=1)

当我们输出 entry_obj.blog,返回的就是一个 Blog 的实例,是一个 object,

而输出 entry_obj.blog_id,返回的就是一个int 型的数据。

那么,我们如何为 Entry 实例保存 blog 字段呢,
如果我们有一个 blog 实例为 blog_1,那么可以直接使用:

entry_obj.blog = blod_1
entry_obj.save()

如果我们有某个 Blog 的主键 id 为 blog_id,那么我们可以这样操作:

entry_obj.blog_id = blod_id
entry_obj.save()

到此这篇关于Django中外键ForeignKey介绍使用的文章就介绍到这了,更多相关Django 外键ForeignKey内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Django外键(ForeignKey)操作以及related_name的作用详解

    之前已经写过一篇关于Django外键的文章,但是当时并没有介绍如何根据外键对数据的操作,也就是如何通过主表查询子表或者通过子表查询主表的信息 首先我定义了两个模型,一个是老师模型,一个是学生模型,一个老师对应多个学生,这个算是一个一对多的类型(如下图所示) 那么如果我们要想查询一个老师对应的学生有哪些,该如何操作呢? 首先我们先查询到老师的信息,在这里我们使用python shell 进行演示  ,输入命令python manage.py shell 进入python shell操作界面: 第一

  • django foreignkey外键使用的例子 相当于left join

    django外键使用 一对一 因为django中处于安全和方便将数据库中的表封装成模型,所以很多sql原生的功能无法使用, 比如 left join,但是我们可以使用外键(foreignkey)来满足表表直接的关系. 设置模型 # 在models.py 中添加 # Person 模型有两个外键, School和Province # class Province(models.Model): name = models.CharField('省份', max_length = 10) post =

  • django foreignkey(外键)的实现

    foreignkey是一种关联字段,将两张表进行关联的方式,我们在dodels.py里写入要生成的两张表: class Usergroup(models.Model): uid=models.AutoField(primary_key=True) caption=models.CharField(max_length=64,null=True) ctime=models.DateField(auto_now_add=True,null=True) uptime=models.DateField(

  • 对django 2.x版本中models.ForeignKey()外键说明介绍

    下面是代码 class GroupInfos(models.Model): uid = models.AutoField(primary_key=True) caption = models.CharField(max_length=32, unique=True) ctime = models.DateTimeField(auto_now_add=True, null=True) uptime = models.DateTimeField(auto_now=True, null=True) c

  • Django中外键ForeignKey介绍使用

    目录 1.on_delete 2.related_name 3.related_query_name 4.外键字段的保存 这一篇笔记介绍 Django 系统 model 的外键处理,ForeignKey 以及相应的处理方法. 这是一种一对多的字段类型,表示两张表之间的关联关系. 本篇笔记的目录如下: on_delete related_name related_query_name 外键字段的保存 1.on_delete 假设有两个 application,app1 和 app2 app1 下的

  • Django中外键使用总结

    目录 了解外键 使用外键 在同一个app中使用外键 外间删除操作的参数意思: 在写项目的过程中我们不可避免的会使用到外键这个东西,那么Django中是怎样来使用外键的呢? 了解外键 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的.外键的存在使得ORM框架在处理表关系的时候异常的强大.MySQL数据库默认使用的也是InnoDB引擎. 使用外键 新建一个项目,创建一个article的app,添加至settings中,并且在se

  • 解决django框架model中外键不落实到数据库问题

    在外键字段的参数中添加db_constraint=False即可,数据库中没有外键关系,代码中依然可以按照正常外键方式使用. 例如: class User(models.Model): name = models.CharField(max_length=255) room = models.ForeignKey(Room, db_constraint=False) class Room(models.Model): status = models.IntegerField(default=1)

  • 关于Django外键赋值问题详解

    本文主要给大家介绍关于Django外键赋值的相关内容,分享出来供大家参考学习,在开始之前,我们先来看一段代码: class Article(models.Model): title = models.CharField(max_length=1024, default='') ... def __str__(self): return 'Article pk:%d %s' % (self.pk, self.title[:30]) class ArticleContent(models.Model

  • Django 外键查询的实现

    目录 一.一对多 二.多对多(返回的内部是相关类的对象的查询集) 创建三张表,详情如下: class Publish(models.Model): id = models.AutoField(primary_key=True, auto_created=True) pname = models.CharField(max_length=40) city = models.CharField(max_length=50) def __str__(self): return self.pname c

  • Django框架模型简单介绍与使用分析

    本文实例讲述了Django框架模型简单介绍与使用.分享给大家供大家参考,具体如下: ORM介绍 ORM Object relational mapping 对象关系映射 把面向对象中的类和数据库表一一对应起来,通过操作类和对象,对数据库表实现数据的增删改查等操作,而不需要写SQL语句(由orm框架生成) Django是实现了ORM的一个框架,在django项目与数据库之间起着桥梁的角色. 使用ORM可以通过方便的配置,切换使用不同的数据库 使用django进行数据库开发的步骤如下: 在model

  • 对Django外键关系的描述

    注:本文需要你有一定的数据库知识,本文的数据库语法使用mysql书写 Django中,跟外键有关的关系有三种,下面来一一介绍. OneToManyField 这种最好理解,说白了就是最普通的外键,看看下面两个模型: class GoodsType(models.Model): name = models.CharField(max_length=50) class GoodsMessage(models.Model): Title = models.CharField(max_length='1

  • django 外键model的互相读取方法

    先设定一个关系模型如下: from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=50) email = mo

随机推荐