当前位置: 首页 > news >正文

Django 多对多关系

多对多关系作用

Django 中,多对多关系模型的作用主要是为了表示两个模型之间的多对多关系。具体来说,多对多关系允许一个模型的实例与另一个模型的多个实例相关联,反之亦然。这在很多实际应用场景中非常有用,比如:

  1. 博客和标签:一篇博客文章可以有多个标签,一个标签也可以属于多篇博客文章。
  2. 学生和课程:一个学生可以选修多门课程,一门课程也可以有多个学生选修。
  3. 作者和书籍:一本书可以有多个作者,一个作者也可以写多本书。

 以下实现简易博客和标签的示例

1,创建应用

Test/app10

python manage.py startapp app10

2,注册应用

Test/Test/settings.py

4,添加路由

Test/Test/urls.py

from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('', include('app9.urls')),# ...path('app10/', include('app10.urls')),
]

5,添加模型

Test/app10/models.py

from django.db import modelsclass Tag(models.Model):name = models.CharField(max_length=100)def __str__(self):return self.nameclass Post(models.Model):title = models.CharField(max_length=200)content = models.TextField()tags = models.ManyToManyField(Tag, related_name='posts')def __str__(self):return self.title

6,执行迁移

python manage.py makemigrations app10
python manage.py migrate app10

 

 

7,添加视图函数

Test/app10/views.py

from django.shortcuts import render
from .models import Postdef post_list(request):posts = Post.objects.all()return render(request, '10/post_list.html', {'posts': posts})

8,添加html代码

Test/templates/10/post_list.html

<!DOCTYPE html>
<html>
<head><title>Blog</title>
</head>
<body><h1>Blog Posts</h1><ul>{% for post in posts %}<li><h2>{{ post.title }}</h2><p>{{ post.content }}</p><p>Tags:{% for tag in post.tags.all %}{{ tag.name }}{% if not forloop.last %}, {% endif %}{% endfor %}</p></li>{% endfor %}</ul>
</body>
</html>

9,添加应用路由

Test/app10/urls.py

from django.contrib import admin
from django.urls import path
from app10 import viewsurlpatterns = [path('admin/', admin.site.urls),path('post_list', views.post_list, name='post_list'),
]

10,管理台添加数据

http://127.0.0.1:8000/admin/

 添加标签

添加文章并关联标签

11,访问页面

http://127.0.0.1:8000/app10/post_list

12,查看数据库

app10_tag 标签表

app10_post 文章表 

app10_post_tags

可以看到app10_post_tags表关联另外两张表的id,建立了多对多的关系关系

13,删除文章

13.1  添加删除文章视图函数

Test/app10/views.py

from django.shortcuts import render
from .models import Postdef post_list(request):posts = Post.objects.all()return render(request, '10/post_list.html', {'posts': posts})from django.shortcuts import render, get_object_or_404, redirect
from .models import Postdef delete_post(request, post_id):post = get_object_or_404(Post, id=post_id)if request.method == 'POST':post.delete()return redirect('post_list')return render(request, '10/confirm_delete.html', {'post': post})

 

13.2 添加html代码

Test/templates/10/confirm_delete.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><!-- templates/blog/confirm_delete.html -->
<form method="post">{% csrf_token %}<p>你确认要删除文章吗?</p><button type="submit">确认</button>
</form></body>
</html>

13.3 添加路由地址

 Test/app10/urls.py

from django.contrib import admin
from django.urls import path
from app10 import viewsurlpatterns = [path('admin/', admin.site.urls),path('post_list', views.post_list, name='post_list'),path('delete_post/<int:post_id>/', views.delete_post, name='delete_post'),
]

13.4 访问页面

http://127.0.0.1:8000/app10/delete_post/2/

14,对比数据库数据 

删除前

删除后

 

可以看到,我们通过post_id删除文章和关系表的数据,但是为什么标签表没有被删除呢?

在 Django 中,当你删除一个模型实例时,Django 会自动处理与该实例相关的多对多关系,但不会删除关联的标签。这是因为标签可能与其他文章也有关系,删除标签会影响其他数据的完整性。 

  1. 多对多关系的管理

    • 在 Django 中,多对多关系通过一个中间表来管理。当你删除一个 Post 实例时,Django 会自动删除中间表中与该 Post 实例相关的记录,但不会删除 Tag 表中的记录。
  2. 数据完整性

    • 标签(Tag)通常是共享资源,可能被多个文章(Post)使用。如果删除某篇文章时也删除了标签,那么其他使用该标签的文章就会受到影响。因此,Django 默认不会删除标签。

Django admin后台及创建超级账号可参考:

Django 一对多关系-CSDN博客

相关文章:

Django 多对多关系

多对多关系作用 Django 中&#xff0c;多对多关系模型的作用主要是为了表示两个模型之间的多对多关系。具体来说&#xff0c;多对多关系允许一个模型的实例与另一个模型的多个实例相关联&#xff0c;反之亦然。这在很多实际应用场景中非常有用&#xff0c;比如&#xff1a; 博…...

构建 Audio Unit 应用程序

构建 Audio Unit 应用程序 构建 Audio Unit 应用程序从选择设计模式开始I/O Pass ThroughI/O Without a Render Callback FunctionI/O with a Render Callback FunctionOutput-Only with a Render Callback Function其他设计模式 构建应用程序配置 audio session指定 audio uni…...

JavaScript 实用技巧

1. 使用 const 和 let 替代 var 在 ES6 之前&#xff0c;我们通常使用 var 声明变量。但如今&#xff0c;推荐使用 const 和 let&#xff0c;因为它们具有块级作用域&#xff0c;可以避免很多潜在的问题。 const PI 3.14; // 常量&#xff0c;无法重新赋值 let age 25; // …...

Python协作运动机器人刚体力学解耦模型

&#x1f3af;要点 &#x1f3af;腿式或固定式机器人模型 | &#x1f3af;网格、点云和体素网格碰撞检测 | &#x1f3af;正反向运动学和动力学 | &#x1f3af;机器人刚体力学计算 | &#x1f3af;编辑参考系姿势和路径 | &#x1f3af;软件接口实体机器人模拟 | &#x1f3a…...

可重入锁思想,设计MQ迁移方案

如果你的MQ消息要从Kafka切换到RocketMQ且不停机&#xff0c;怎么做&#xff1f;在让这个MQ消息调用第三方发奖接口&#xff0c;但无幂等字段又怎么处理&#xff1f;今天小傅哥就给大家分享一个关于MQ消息在这样的场景中的处理手段。 这是一种比较特例的场景&#xff0c;需要保…...

Redis安装与使用

目录 1、介绍 1、redis的特点: 2、缓存 2、安装Redis 1、安装单机版redis 2、redis-cli命令参数 3、清空数据库的两种方式和作用域&#xff1a; 4、redis的增删查改命令 5、redis的查看所有分类命令 6、redis过期时间与控制键的行为 7、redis的相关工具 1、介绍 r…...

base64字符串空格问题

客户端使用的Content-Type为application/x-www-form-urlencoded时&#xff0c;字符串中出现了空格&#xff0c;base64解码时出错了&#xff0c;因为原来的字符有号&#xff0c; Spring Boot 对于Content-Type为application/x-www-form-urlencoded的HTTP请求&#xff0c;默认情…...

【BES2500x系列 -- RTX5操作系统】深入探索CMSIS-RTOS RTX -- 同步与通信篇 -- 消息队列和邮箱处理 --(四)

&#x1f48c; 所属专栏&#xff1a;【BES2500x系列】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f49…...

电信NR零流量小区处理

【摘要】随着目前网络建设逐步完善&#xff0c;5G用户的不断发展&#xff0c;针对零流量小区的分析及处理存在着必要性&#xff0c;零流量小区的出现既是用户分布及行为的直观体现&#xff0c;也是发展用户的一个指引&#xff0c;同时也能发现设备的一些故障。一个站点的能够带…...

ArcTs布局入门03——层叠布局(Stack)

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01; 扫描下面的二维码关注公众号。 1、概述 叠布局&#xff08;StackLayout&#xff09;用于在屏幕上预留一块区域来显示组件中的元素&#xff0c;提供元素可以重叠的布局。层叠布局通过Stack容器组件实…...

C语言之线程的学习

线程属于某一个进程 共同点&#xff1a;都能并发 线程共享变量&#xff0c;进程不共享。 多线程任务中&#xff0c;其中某一个线程调用了exit了&#xff0c;其他线程会跟着一起退出 如果是特定的线程就调用pthread_exit 失败返回的是错误号 下面也是...

HT8691 内置升压模块的D类音频功率放大器芯片IC

一般描述 HT8691是一款内置升压模块的D类音频功率放大器。内置的升压模块可通过外置电阻调节升压值&#xff0c;即使是锂电池供电&#xff0c;在升压至6.5V时&#xff0c;10%THDN,4Ω负载条件下能连续输出5.5W功率;升压至7V,3Ω负载条件下则能连续输出7.0W功率。其支持外部设置…...

和小红书一起参会! 了解大模型与大数据融合的技术趋势

在过去的两年中&#xff0c;“大模型”无疑成为互联网行业的焦点话题&#xff0c;曾经炙手可热的大数据架构似乎淡出公众视野。然而&#xff0c;大数据领域并未停滞不前&#xff0c;反而快速演进&#xff0c;传统依赖众多开源组件的大数据平台正逐步过渡到以融合与简化为核心特…...

【vocabulary in use (elementary)】7 Feeling

happy 高兴 sad 伤心 angry 生气 upset 丧气 cold 冷 hot 热 thirsty 口渴 hungry 饿 well 很好 ill 生病 tired 累了 surprised 惊讶 关于喜欢的表达&#xff1a; like to do 偶尔一次喜欢 like doing 一直喜欢的 outdoor activities 户外运动 be keep on doing 坚持做 be fo…...

Keil5 ST-LINK setting闪退问题解决

1. 官网下载新版驱动文件 MDK uVision crashes when using ST-Link debugger 2. 解压替换 STLinkUSBDriver6.1.2.0Signed 我的库文件目录&#xff1a; D:\Tool\Keil5\ARM\STLink...

熟练掌握Docker及linux常用命令排查线上问题。熟悉Git, Maven等项目管理及构建工具,熟悉微服务中基于Jenkins的CI/CD

掌握Docker、Linux命令、项目管理及构建工具&#xff0c;以及CI/CD流程是现代软件开发和运维的关键技能。以下是对这些技能的概述和一些实践建议&#xff1a; ### Docker - **概述**&#xff1a;Docker是一个开源的容器化平台&#xff0c;允许开发者打包应用及其依赖到一个可移…...

78.Vue 3 重用性模态框组件

模态框是大多数 Web 应用程序中的基本构建块。虽然最初实现起来可能看起来有点棘手&#xff0c;但实际上&#xff0c;使用 Vue 和一些 Flexbox 技巧&#xff0c;这不仅可行&#xff0c;而且非常简单。 让我们一起实现一个基础的模态框组件。 架构如下&#xff1a; AppModal.vue…...

《昇思25天学习打卡营第9天|onereal》

继续学习昨天的 基于MindNLPMusicGen生成自己的个性化音乐 生成音乐 MusicGen支持两种生成模式&#xff1a;贪心&#xff08;greedy&#xff09;和采样&#xff08;sampling&#xff09;。在实际执行过程中&#xff0c;采样模式得到的结果要显著优于贪心模式。因此我们默认启…...

Wireshark - tshark支持iptables提供数据包

tshark现在的数据包获取方式有两种&#xff0c;分别是读文件、网口监听&#xff08;af-packet原始套接字&#xff09;。两种方式在包获取上&#xff0c;都是通过读文件的形式&#xff1b;存在文件io操作&#xff0c;在专门处理大流量的情境下&#xff0c; 我们复用wireshark去做…...

快团团团长如何批量退款可自定义退款金额(批量退差价)?

快团团团长如何批量退款可自定义退款金额&#xff08;批量退差价&#xff09;&#xff1f; 在售后处理中&#xff0c;经常会出现需要给某一商品退差价的场景&#xff0c;因此在批量退款时需要自定义退款金额。现快团团已支持批量退自定义金额&#xff0c;操作方法和注意事项如…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...