通过一个实际例子说明Django中的数据库操作方法法ForeignKey()的用法【数据表“一对多”关系】

这篇具有很好参考价值的文章主要介绍了通过一个实际例子说明Django中的数据库操作方法法ForeignKey()的用法【数据表“一对多”关系】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当使用Django进行数据库操作时,ForeignKey(外键)是一种非常有用的字段类型。它允许在数据库表之间创建关联关系,类似于其他数据库系统中的外键概念。通过ForeignKey字段,我们可以建立一个模型与另一个模型的一对多关系。

以下是一个实际例子,使用ForeignKey字段在Django中创建一对多关系,初学者可以通过这个实际例子去仔细观察数据表“一对多”关系是怎么一回事儿。

假设我们正在开发一个博客应用程序,其中有两个主要的模型:作者(Author)和文章(Post)。一个作者可以有多篇文章,而一篇文章只能由一个作者撰写。在这种情况下,我们可以使用ForeignKey字段将文章与作者关联起来。

首先,让我们创建Author模型和Post模型:

from django.db import models

# Create your models here.

class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    writer = models.ForeignKey(Author, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

在上述代码中,我们定义了Author模型和Post模型。Post模型中的writer字段是一个ForeignKey字段,它将Post模型与Author模型相关联。on_delete=models.CASCADE参数表示当关联的作者被删除时,与该作者关联的所有文章也将被删除。

接下来,我们可以使用这些模型创建数据库表:

python manage.py makemigrations
python manage.py migrate

现在我们已经创建了Author和Post表,我们用下面的代码来演示数据表“一对多”关系的操作及对数据表的影响。

import os
import django

# 设置Dango运行时需要的环境变量DJANGO_SETTINGS_MODULE
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myshop.settings')

# 加载Django的设置
django.setup()

# 导入模型
from app1.models import Author, Post

# 创建一个作者
author1 = Author(name='wenhao')
author1.save()

# 创建一篇文章,并将其与刚才创建的作者相关联
post1 = Post(title='First Post', content='Hello, World!', writer=author1)
post1.save()

# 再创建一篇文章,也将其与刚才创建的作者相关联
post2 = Post(title='My love', content='I love wang hong', writer=author1)
post2.save()

# 获取一个作者的所有文章
author_get = Author.objects.get(name='wenhao')
posts_all = author_get.post_set.all()
for post in posts_all:
    print(post)


在上面的代码中,作者“wenhao”发表了两篇文章,文章的title分别为’First Post’和’My love’,通过Post模型的一对多成员writer关联到表 Author。

如果要理解语句posts_all = author_get.post_set.all()中的post_set(),请参看我的另一篇博文,链接:https://blog.csdn.net/wenhao_ir/article/details/131668597

上面的代码运行结果如下:
通过一个实际例子说明Django中的数据库操作方法法ForeignKey()的用法【数据表“一对多”关系】,Django,数据库,django,sqlite
可见作者“wenhao”对应的两篇文章的标题被打印出来了。
这里要多问一句,为什么内容没被打印出来呢?
请注意数据表模型中定义的下面语句:

    def __str__(self):
        return self.title

并结合Python的“魔术方法“(magic method)或“特殊方法“(special method)去理解这个问题,关于Python的“魔术方法“(magic method)或“特殊方法“(special method),请参见链接:https://blog.csdn.net/wenhao_ir/article/details/131395984

我们再去观察一下数据表中的内容,如下:
通过一个实际例子说明Django中的数据库操作方法法ForeignKey()的用法【数据表“一对多”关系】,Django,数据库,django,sqlite

通过一个实际例子说明Django中的数据库操作方法法ForeignKey()的用法【数据表“一对多”关系】,Django,数据库,django,sqlite

大家可以仔细观察下这两张表的内容,看下Author是怎样和Post进行一对多关联的。
从上面的数据库截图中可以看出,在表 app1_post中,外键字段的名字为 writer_id,而不是想像中的 writer,这一点要注意,其值就是作者wenhao在表app_author中的id字段。
显然,光凭数据表里的数据,是无法知道字段表 app1_post中的writer_id是指向表app_author中的数据,Django肯定在另外的地方记录下了这种对应关系,记录下这种对应关系的表叫“中间关系表”,这个“中间关系表”并没有在数据库中,目前昊虹君也不知道具体在哪里。不过在Django的某个地方,肯定存在着一个“中间关系表”,它的内容如下:
writer_set→Author
提问:_set 是怎么来的?
答:从writer映射到模型Author 的关系在数据库中叫做反向关系,writer_set称为反向关系名,即related_name,如果不指定反向关系名,统就会以"字段名_set"的格式作为其默认反向关系名。

显然,如果模型中,有多个“一对多”或“多对多”关系时,相应的字段名不能相同,否则会引起冲突。为什么?举个例子,假如另一个模型中也有一个一对多的关系,这个一对多的关系指向模型Book,但是这个一对多的关系的字段名也为writer,那么“中间关系表”中就会存在一条下面这样的反向关系记录:
writer_set→Book
所以,“中间关系表”的内容如下:

writer_set→Author
writer_set→Book

这样,通过中间关系表就无法分清楚到底是哪个writer与Author模型相对应,又是哪个writer与Book模型相对应。
如果不能避免字段名字的相同,就要使用相关名称参数(related_name)来为其在中间关系表中指定反向关系名,比如:

writer = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='blogs_writer')
writer = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='book_writer')

经上面的两条代码指定反向关系名,便没有冲突了。
并且用related_name参数指定反向关系名后,就可以用这个反向关系名来访问相应的字段了,比如下面这个示例:

# 获取一个作者的所有文章
author_get = Author.objects.get(name='wenhao')
posts_all = author_get.blogs_writer.all()
for post in posts_all:
    print(post)

运行上面的代码,可得到下面的结果:
通过一个实际例子说明Django中的数据库操作方法法ForeignKey()的用法【数据表“一对多”关系】,Django,数据库,django,sqlite

在建立一对多关系或多对多关系时,建议大家指定不容易重复的反向关系名,这样可以提高代码的健壮性。

扩展阅读:
Django中使用反向关系名称(related_name)解决由“多对多”关系引起的字段名字冲突问题引起的迁移命令报错。文章来源地址https://www.toymoban.com/news/detail-519853.html

到了这里,关于通过一个实际例子说明Django中的数据库操作方法法ForeignKey()的用法【数据表“一对多”关系】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • django对数据库中的表进行重新生成

    删除数据库中的表 删除项目中migrations包下的初始化文件 进入到manage.py目录下执行命令 python manage.py makemigrations 执行完上述命令之后,再执行命令 python manage.py migrate 就可以啦 最后执行 python manage.py runserver 运行我们的Django项目 关于详细的数据表生成见博文:https://blog.csdn.n

    2024年02月16日
    浏览(45)
  • Django的数据库操作中的F对象是什么东西?

    在Django中, F 对象是一个用于表示数据库字段的值的特殊对象。 它允许你在数据库层面进行原子操作,而不需要先将数据从数据库中检索到Python层再进行操作。 F 对象的使用通常涉及到数据库更新,特别是在处理并发操作时。 以下是 F 对象的主要特性和用法: 原子操作:

    2024年01月18日
    浏览(55)
  • 使用Django数据库模型中的ForeignKey()形成数据表记录的父子层次结构

    可以把ForeignKey()的第1个参数设置为值 “self” 实际形成数据表记录的父子层次结构。 下面是一个简单的实例: 在文件 E:Python_projectP_001myshop-testmyshopapp1models.py 中写入下面的代码: 启动数据库… 然后执行数据库迁移指令: 接下来在文件 E:Python_projectP_001myshop-testmyshop

    2024年02月16日
    浏览(69)
  • Django的数据库模型迁移命令makemigrations和migrate是否会导致数据库中的数据丢失?

    我们知道,如果在Django的文件models.py中写好了数据库模型,要生成对应的数据库,需要执行下面两条命令: 其中命令 makemigrations 是生成迁移执行文件,命令 migrate 是执行迁移命令。 那么如果修改了数据库模型文件models.py的内容,比如新增了一张表,那么是否会造成原来数据

    2024年02月12日
    浏览(53)
  • Django中数据库模型中的DecimalField字段和IntegerField字段有何区别?

    在Django的数据库模型中, DecimalField 和 IntegerField 是两种不同的字段类型,用于存储数字数据。它们的主要区别在于支持的数据范围和精度。 IntegerField 是用于存储整数值的字段类型。它可以存储包含正数、负数和零在内的整数值。 IntegerField 的取值范围是由所使用的数据库系

    2024年02月16日
    浏览(37)
  • 创建一个django项目详细说明

    1.首先安装django   pip install django 2.创建django项目 输入命令后自动生成相关文件 manage.py文件:这是管理Django项目的重要命令行工具,它主要用于启动项目、创建应用和完成数据库的迁移等。 settings.py文件:这是Django项目的配置文件,包含了项目的基本信息、静态文件路径、模

    2024年02月16日
    浏览(46)
  • 在Django的数据库模型的类中,通常还会定义一个名叫Meta的内部类,这个类有什么作用?

    在Django的数据库模型中, Meta 类是一个内部类,用于定义一些与模型相关的元数据(metadata)。它提供了一种在模型类中指定各种选项和配置的方式。 以下是 Meta 类的一些常见用途和作用: 定义模型的数据库表名: 通过 db_table 选项可以指定模型对应的数据库表的名称。例如

    2024年02月12日
    浏览(53)
  • 稳了,终于可以通过外网访问 Sealos 中的数据库了!

    喜大普奔,Sealos 中的数据库功能现已全面升级,支持外网访问! 现在你可以从互联网的任何地方访问 Sealos 中的数据库 ,无论您的应用部署在何种环境,现在都可以轻松通过外网连接到 Sealos 中的数据库,打破地理限制,提升工作效率和灵活性。 目前数据库是通过 NodePort 暴

    2024年02月05日
    浏览(48)
  • 通过sql语句查询出某个字段在数据库中的某个表

    新入职的小伙伴,肯定还没熟悉数据库中表于表的关系以及表中的字段的含义是什么,就需要进行需求开发,导致会出现对某个字段在哪张表里面都分辨不清,不过不要怕,可以利用已下sql语句快速找到。(要注意的是,此方法可能不适用于所有类型的数据库系统,但对于大

    2024年02月16日
    浏览(74)
  • Springboot通过前端发起请求,拿到数据库中的数据并生成excel表格,postman请求并下载文件

    springboot版本3.2.0,数据库版本8 mybatisplus版本3.5.4.1 依赖 实体类 实体类中的枚举类型转换,因调用方法后还是不能转换类型所以暂未解决 Controller层 postman测试 Excel表格 获取数据成功

    2024年01月18日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包