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博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39447.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39447.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39447.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【每日一個Git命令: cherry-pick】

git cherry-pick 命令的作用是將指定的提交&#xff08;commit&#xff09;應用到其他分支上。這個命令允許你選擇一個或多個已有的提交&#xff0c;并將它們作為新的提交引入到當前分支中。 這個過程不會改變項目的歷史記錄&#xff0c;因為它實際上是創建了這些提交的副本。…

BMA530 運動傳感器

型號簡介 BMA530是博世&#xff08;bosch-sensortec&#xff09;的一款運動傳感器。時尚簡約的可穿戴設備為功能強大的組件提供了很小的空間。具有先進功能集的下一代加速度計是世界上最小的加速度傳感器&#xff08;1.2 x 0.8 x 0.55 mm&#xff09;。它專為緊湊型設備而設計&…

24/07/02數據結構(1.1201)算法效率順序表

數據結構基本內容:1.時間復雜度 空間復雜度2.順序表鏈表3.棧 隊列4.二叉樹5.排序 數據結構是存儲,組織數據的方式.指相互之間存在一種或多種特定關系的數據元素的集合 算法是定義良好的計算過程.取一個或一組值為輸入并產生一個或一組值為輸出. 需要知道雖然選擇題有20-30個…

Leetcode1114 交替打印 FooBar及其測試

題目描述 相關標簽 相關企業 給你一個類&#xff1a; class FooBar { public void foo() { for (int i 0; i < n; i) { print(“foo”); } } public void bar() { for (int i 0; i < n; i) { print(“bar”); } } } 兩個不同的線程將會共用一個 FooBar 實例&#xf…

python自動化運維--DNS處理模塊dnspython

1.dnspython介紹 dnspython是Pyhton實現的一個DNS工具包&#xff0c;他幾乎支持所有的記錄類型&#xff0c;可以用于查詢、傳輸并動態更新ZONE信息&#xff0c;同事支持TSIG&#xff08;事物簽名&#xff09;驗證消息和EDNS0&#xff08;擴展DNS&#xff09;。在系統管理方面&a…

Linux高并發服務器開發(九)Tcp狀態轉移和IO多路復用

文章目錄 0 包裹函數1 多進程服務器流程代碼 2 多線程服務器3 TCP狀態轉移半關閉心跳包 4 端口復用5 IO多路復用技術高并發服務器 6 select代碼總結 7 POLLAPI代碼poll相對select的優缺點 8 epoll&#xff08;重點&#xff09;API監聽管道代碼EPOLL 高并發服務器 9 Epoll的兩種…

Iot解決方案開發的體系結構模式和技術

前言 Foreword 計算機技術起源于20世紀40年代&#xff0c;最初專注于數學問題的基本原理&#xff1b;到了60年代和70年代&#xff0c;它以符號系統為中心&#xff0c;該領域首先開始面臨復雜性問題&#xff1b;到80年代&#xff0c;隨著個人計算的興起和人機交互的問題&#x…

【進階篇】Java 項目中對使用遞歸的理解分享

前言 筆者在最近的項目開發中&#xff0c;遇到了兩個父子關系緊密相關的場景&#xff1a;評論樹結構、部門樹結構。具體的需求如&#xff1a;找出某條評論下的所有子評論id集合&#xff0c;找出某個部門下所有的子部門id集合。 在之前的項目開發經驗中&#xff0c;遞歸使用得是…

centos7安裝python3.10

文章目錄 1. 安裝依賴項2. 下載Python 3.10源碼3. 解壓源碼并進入目錄4. 配置安裝選項5. 編譯并安裝Python6. 驗證安裝7.創建軟連接8. 安裝pip39. 換源 1. 安裝依賴項 sudo yum groupinstall -y "Development Tools" sudo yum install -y openssl-devel bzip2-devel…

Eureka的自擴展之道:服務自動擴展的秘訣

&#x1f31f; Eureka的自擴展之道&#xff1a;服務自動擴展的秘訣 在微服務架構中&#xff0c;服務的自動擴展是實現高可用性和彈性伸縮的關鍵。Eureka作為Netflix開源的服務發現框架&#xff0c;提供了一套機制來支持服務的自動擴展。本文將詳細介紹Eureka如何實現服務的自動…

【LeetCode】十、二分查找法:尋找峰值 + 二維矩陣的搜索

文章目錄 1、二分查找法 Binary Search2、leetcode704&#xff1a;二分查找3、leetcode35&#xff1a;搜索插入位置4、leetcode162&#xff1a;尋找峰值5、leetcode74&#xff1a;搜索二維矩陣 1、二分查找法 Binary Search 找一個數&#xff0c;有序的情況下&#xff0c;直接…

第4章:Electron主窗口與子窗口管理

4.1 創建主窗口 主窗口是 Electron 應用啟動后顯示的第一個窗口&#xff0c;通常用來承載應用的主界面。我們使用 BrowserWindow 類來創建主窗口。 4.1.1 創建主窗口的基礎代碼 // 引入 Electron 模塊和 Node.js 的 path 模塊 const { app, BrowserWindow } require(electr…

【動態規劃 前綴和】2478. 完美分割的方案數

本文涉及知識點 劃分型dp 動態規劃匯總 C算法&#xff1a;前綴和、前綴乘積、前綴異或的原理、源碼及測試用例 包括課程視頻 LeetCode 2478. 完美分割的方案數 給你一個字符串 s &#xff0c;每個字符是數字 ‘1’ 到 ‘9’ &#xff0c;再給你兩個整數 k 和 minLength 。 如…

【C++ Primer Plus學習記錄】指針和const

可以用兩種不同的方式將const關鍵字用于指針。第一種方法是讓指針指向一個常量對象&#xff0c;這樣就可以防止使用該指針來修改所指向的值&#xff0c;第二種方法是將指針本身聲明為常量&#xff0c;這樣可以防止改變指針指向的位置。 首先&#xff0c;聲明一個指向常量的指針…

前后端防重復提交(續)

前文介紹過前后端防重復提交的基本場景&#xff0c;簡單的情況是只發起一個異步請求&#xff0c;如果有多個異步請求怎么操作呢&#xff1f;這個要分情況看下。 如果是后端服務器的接口支持一次傳遞多個申請&#xff0c;那么可以將任務放進數組中&#xff0c;發往后端。這是最好…

074、Python 關于實例方法、靜態方法和類方法

在Python中&#xff0c;類可以定義三種類型的方法&#xff1a;實例方法、靜態方法和類方法。每種方法都有其特定的用途和調用方式。 實例方法&#xff08;Instance Methods&#xff09; 定義&#xff1a;實例方法是綁定到類實例上的方法。它們必須有一個名為self的隱式第一個參…

golang 1.22特性之for loop

背景 go1.22版本 for loop每輪循環都生成新的變量. 原諒: https://tip.golang.org/doc/go1.22 Previously, the variables declared by a “for” loop were created once and updated by each iteration. In Go 1.22, each iteration of the loop creates new variables, to …

【C++11】自己封裝RAII類,有哪些坑點?帶你了解移動語義的真相

文章目錄 一、持有資源的類定義移動構造函數的要點1.普通內置類型與std::move2.常見的容器與std::move3.結構體&#xff1a;4.智能指針與std::move 參考 一、持有資源的類定義移動構造函數的要點 1.普通內置類型與std::move 在C中&#xff0c;std::move 主要用于對象的移動語…

Wireshark - tshark支持iptables提供數據包

tshark現在的數據包獲取方式有兩種&#xff0c;分別是讀文件、網口監聽&#xff08;af-packet原始套接字&#xff09;。兩種方式在包獲取上&#xff0c;都是通過讀文件的形式&#xff1b;存在文件io操作&#xff0c;在專門處理大流量的情境下&#xff0c; 我們復用wireshark去做…

Windows編程上

Windows編程[上] 一、Windows API1.控制臺大小設置1.1 GetStdHandle1.2 SetConsoleWindowInfo1.3 SetConsoleScreenBufferSize1.4 SetConsoleTitle1.5 封裝為Innks 2.控制臺字體設置以及光標調整2.1 GetConsoleCursorInfo2.2 SetConsoleCursorPosition2.3 GetCurrentConsoleFon…