Django ORM(多表)

文章目录

  • 前言
  • 一、关联关系模型
  • 二、一对多写入数据
  • 二、多对多写入数据
  • 二、跨表查询
    • 1.查找'test' 标签的文章
    • 2.查找作者名为 'test' 的文章及标签
  • 三、跨表删除


前言

表与表之间的关系可分为以下三种:

一对一: 一对一关系表示一个模型的每个实例与另一个模型的每个实例都只关联一次
用 OneToOneField 来定义这种关系
一对多: 一对多关系表示一个模型的每个实例可以关联多个另一个模型的实例,但另一个模型的实例只能关联一个前者的实例
用 ForeignKey 来定义这种关系
多对多: 多对多关系表示两个模型的每个实例可以与对方的多个实例关联
用 ManyToManyField 来定义这种关系

之前我们定义了一个article模型,我们就基于这个模型实现关联关系

一、关联关系模型

更新fa下models.py

from django.db import modelsclass Tag(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=50, unique=True)created_at = models.DateTimeField(auto_now_add=True)    updated_at = models.DateTimeField(auto_now=True)def __str__(self):return self.nameclass Author(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=255)email = models.EmailField(max_length=255)created_at = models.DateTimeField(auto_now_add=True)    updated_at = models.DateTimeField(auto_now=True)def __str__(self):return self.nameclass Article(models.Model):id = models.AutoField(primary_key=True)title = models.CharField(max_length=255)content = models.TextField()author = models.ForeignKey(Author, null=True, on_delete=models.CASCADE)# ManyToManyField不会直接在article表显示tag相关字段# Django 会为 ManyToManyField 创建一个中间表来存储 Article 和 Tag 之间的多对多关系# Django 会创建一个类似于 article_tags 的中间表,它包含 article_id 和 tag_id 两个字段,分别表示 Article 和 Tag 之间的关联tags = models.ManyToManyField(Tag, blank=True, related_name='articles')  # Many-to-many relationship with Tag modelcreated_at = models.DateTimeField(auto_now_add=True)    updated_at = models.DateTimeField(auto_now=True)def __str__(self):return self.title

再次生成和应用迁移:

python manage.py makemigrations
python manage.py migrate

二、一对多写入数据

views.py增加方法

def add_article(request):author = models.Author.objects.filter(pk=1).first()article = models.Article.objects.create(title="Test Article", content='123456', author=author)return HttpResponse(article)

urls.py增加路由

path('add_article', views.add_article, name='add_article')

访问链接http://127.0.0.1:8082/article/add_article
在这里插入图片描述

二、多对多写入数据

views.py里面新增方法

def add_tag(request):tag = models.Tag.objects.filter(pk=1).first()article = models.Article.objects.filter(pk=1).first()# add() 在即外键中只能传对象( *QuerySet数据类型)不能传 id(*[id表])article.tags.add(tag)return HttpResponse(article.tags.all())

urls.py增加路由

path('add_tag', views.add_tag, name='add_tag'),

访问链接http://127.0.0.1:8082/article/add_tag
刷新中间表可以看到
在这里插入图片描述

二、跨表查询

1.查找’test’ 标签的文章

新增方法

def search(request):# 查找名称为 'test' 的标签tag = models.Tag.objects.filter(name="test").first()if not tag:return HttpResponse("Tag not found")# 使用相关名称访问相关文章# Article模型设置了 related_name,则应该使用这个名称来访问反向关系。例如,如果 related_name 设置为 articles,则应使用 tag.articles.all()。# 而如果没有设置 related_name,则应该使用 tag.article_set.all()。articles = tag.articles.all()# 将结果转换为字符串以便返回articles_list = "\n".join([f"Title: {article.title}, Content: {article.content}" for article in articles])return HttpResponse(articles_list)

访问链接http://127.0.0.1:8082/article/search
在这里插入图片描述

2.查找作者名为 ‘test’ 的文章及标签

方法及路由如下

def search_by_author(request):# 查找作者名为 'test' 的作者author = models.Author.objects.filter(name="test").first()if not author:return HttpResponse("Author not found")# 查询作者的所有文章,并预取每篇文章的所有标签articles = author.article_set.prefetch_related('tags').all()# 构建文章及其标签的字符串articles_list = []for article in articles:tags = ", ".join(tag.name for tag in article.tags.all())  # 获取文章的所有标签articles_list.append(f"Title: {article.title}, Content: {article.content}, Tags: {tags}")# 将结果转换为字符串并返回return HttpResponse("\n".join(articles_list))
path('search_by_author', views.search_by_author, name='search_by_author'),

在这里插入图片描述

三、跨表删除

方法及路由如下

def delete_author_articles(request):# 查找名称为 'test' 的作者author = models.Author.objects.filter(name="test").first()if not author:return HttpResponse("Author not found")# 获取该作者下的所有文章articles = author.article_set.all()# 删除这些文章articles.delete()return HttpResponse("All articles by 'test' have been deleted")
path('delete_author_articles', views.delete_author_articles, name='delete_author_articles'),

访问链接http://127.0.0.1:8082/article/delete_author_articles
在这里插入图片描述
刷新fa_article及中间表fa_article_tags可以看到数据都被清空了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1538674.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试 - 字符串划分(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

Python | Leetcode Python题解之第416题分割等和子集

题目&#xff1a; 题解&#xff1a; class Solution:def canPartition(self, nums: List[int]) -> bool:n len(nums)if n < 2:return Falsetotal sum(nums)if total % 2 ! 0:return Falsetarget total // 2dp [True] [False] * targetfor i, num in enumerate(nums…

最低成本的游戏串流方案分享 如何自己打造云电脑?

今天教大家如何最低成本实现串流 出门在外也可以随时随地游玩端游大作 硬件准备&#xff1a;一台电脑 手机/平板一台 软件&#xff1a;Gameviewer远程 为啥不用moonlight等其他软件呢 因为设置公网穿透等复杂操作对小白来说不太友好 而GameViewer从安装到使用仅需一键 对比同类…

MATLAB系列07:输入/输入函数

MATLAB系列07&#xff1a;输入/输入函数 8. 输入/输入函数8.1 函数textread8.2 关于load和save命令的进一步说明8.3 MATLAB文件过程简介8.4 文件的打开和关闭8.4.1 fopen函数8.4.2 fclose函数 8.5 二进制 I/O 函数8.5.1 fwrite 函数8.5.2 fread函数 8.6 格式化 I/O 函数8.6.1 f…

【C++ 差分数组 前后缀分解】P7404家庭菜园

本文涉及知识点 C差分数组 C前后缀分解 P7404家庭菜园 出自洛谷&#xff0c;我简述一下。 已知数组a&#xff0c;长度为n(1<n<2e5),1 <a[i] <1e9。一次操作如下&#xff1a;将a[i…j]全1。问最少操作多少次&#xff0c;使得a成为山形数组&#xff0c;即存在k&am…

力扣题解2332

大家好&#xff0c;欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述&#xff08;中等&#xff09;​&#xff1a; 坐上公交的最晚时间 给你一个下标从 0 开始长度为 n 的整数数组 buses &#xff0c;其中 buses[i] 表示第 i 辆公交车的出发时间。同时给你一…

算法题——最小会议室数量

题目1: 1.假定会议时间从凌晨零点开始&#xff0c;即 0<si<ei<1440&#xff0c;si和ei代表当天某一时刻从零点开始计算的开始和结束分钟数&#xff0c;如[90,360]&#xff0c;表示会议时间从1:30到6:00。 2.不考虑房间的容量问题&#xff0c;并且公司为了提升大家的体…

计算机组成原理-存储系统(二)半导体存储器

2.1DAM芯片 分类&#xff1a; DRAM芯片&#xff1a;使用栅极电容存储信息SRAM芯片&#xff1a;使用双稳态触发器存储信息 核心区别&#xff1a;储存元不一样 2.2DRAM和SRAM的比较 对于DRAM中&#xff1a; 1&#xff1a;电容内存储了电荷0&#xff1a;电容内未存储电荷 DR…

HTML讲解(一)body部分

目录 1.什么是HTML 2.HTML基本框架 3.标题声明 4.修改标题位置 5.段落声明 6.修改段落位置 7.超链接访问 8.图像访问 9.改变网页背景及文本颜色 10.添加网页背景图 11.超链接改变颜色 12.设置网页边距 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff…

Qt窗口——QMenuBar

文章目录 QMenuBar示例演示给菜单栏设置快捷键给菜单项设置快捷键添加子菜单添加分割线添加图标 QMenuBar Qt中采用QMenuBar来创建菜单栏&#xff0c;一个主窗口&#xff0c;只允许有一个菜单栏&#xff0c;位于主窗口的顶部、主窗口标题栏下面&#xff1b;一个菜单栏里面有多…

【技术解析】消息中间件MQ:从原理到RabbitMQ实战(深入浅出)

文章目录 【技术解析】消息中间件MQ&#xff1a;从原理到RabbitMQ实战(深入浅出)1.简介1.1 什么是消息中间件1.2 传统的http请求存在那些缺点1.3 Mq应用场景有那些1.4 为什么需要使用mq1.5 Mq与多线程之间区别1.6 Mq消息中间件名词1.7主流mq区别对比1.8 Mq设计基础知识 2.Rabbi…

python画图|3D bar进阶探索

前述学习过程只能怪&#xff0c;已经探究了3D直方图的基础教程&#xff0c;详见下述链接&#xff1a; python画图|3D直方图基础教程-CSDN博客 实际上&#xff0c;基础文章直接进入了堆叠教程&#xff0c;相对来说基础的程度不够&#xff0c;因此有必要再次探索。 【1】官网教…

通信工程学习:什么是POS无源光分配器

POS&#xff1a;无源光分配器 POS&#xff08;Passive Optical Splitter&#xff0c;无源光分配器&#xff09;是无源光网络&#xff08;Passive Optical Network, PON&#xff09;中的一个重要组成部分&#xff0c;它位于光线路终端&#xff08;OLT&#xff09;和光网络单元&a…

基于图卷积网络的轻量化推荐模型(论文复现)

基于图卷积网络的轻量化推荐模型&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 概述 图卷积网络&#xff08;Graph Convolution Network&#xff0c;GCN&#xff09;已经广泛的应用于推荐系统&#xff0c;基于GCN的协同过滤算法&#xff08;例如…

【路径规划】人工势场(APF)、涡旋APF、安全APF和动态窗口方法在航点跟踪问题的比较

摘要 本研究比较了几种路径规划算法在航路点跟踪中的性能&#xff0c;包括传统的人工势场算法&#xff08;APF&#xff09;、涡旋人工势场&#xff08;VAPF&#xff09;、安全人工势场&#xff08;SAPF&#xff09;和动态窗口方法&#xff08;DWA&#xff09;。实验结果表明&a…

PyCharm的使用

PyCharm的入门使用教程 下载和安装PyCharm&#xff1a; 首先&#xff0c;访问JetBrains官方网站&#xff08;https://www.jetbrains.com/pycharm/&#xff09;下载PyCharm的最新版本。根据您的操作系统选择合适的版本进行下载。 安装完成后&#xff0c;打开PyCharm。 创建新…

实战分享:我是如何挖到CSDN漏洞的?

文章目录 前言一、过程二、总结《Windows信息安全和网络攻防》——清华大学出版社 前言 CxxN是国内很出名的博客平台&#xff0c;用户量非常大&#xff0c;注册用户据说有1个亿&#xff1f;(官方写的)本次我发现的漏洞详情是可以通过用户的id直接获取用户完整的手机号&#xf…

如何创建和编辑抖音百科词条,不会的找我们代创建!

如何创建和编辑抖音百科词条&#xff0c;不会的找我们代创建&#xff01; 如何创建抖音百科个人词条&#xff0c;个人抖音百科的创建 #抖音百科 #百科 #推广 做过百度百科的老板们注意了&#xff0c;等一下别划走。 2024 年品宣新风口出现了&#xff0c;抖音百科正在替代百度…

金言问卷:国外问卷调查可以做吗?

国外问卷调查可不可以做&#xff1f; 金言问卷告诉你&#xff0c;答案是肯定可以的。接下来就给你讲讲为什么是肯定的答案。 首先&#xff0c;为什么是肯定可以做呢&#xff1f;因为国外问卷调查可以产生收益是真实的&#xff0c;像我们客户昨天193美元1350人民币&#xff0c…

Flutter Android Package调用python

操作步骤 一、创建一个Flutter Package 使用以下指令创建一个Flutter Package flutter create --templateplugin --platformsandroid,ios -a java flutter_package_python 二、修改android/build.gradle文件 在buildscript——>dependencies中添加以下内容 //导入Chaqu…