多對多關系作用
Django 中,多對多關系模型的作用主要是為了表示兩個模型之間的多對多關系。具體來說,多對多關系允許一個模型的實例與另一個模型的多個實例相關聯,反之亦然。這在很多實際應用場景中非常有用,比如:
- 博客和標簽:一篇博客文章可以有多個標簽,一個標簽也可以屬于多篇博客文章。
- 學生和課程:一個學生可以選修多門課程,一門課程也可以有多個學生選修。
- 作者和書籍:一本書可以有多個作者,一個作者也可以寫多本書。
?以下實現簡易博客和標簽的示例
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 會自動處理與該實例相關的多對多關系,但不會刪除關聯的標簽。這是因為標簽可能與其他文章也有關系,刪除標簽會影響其他數據的完整性。?
-
多對多關系的管理:
- 在 Django 中,多對多關系通過一個中間表來管理。當你刪除一個?
Post
?實例時,Django 會自動刪除中間表中與該?Post
?實例相關的記錄,但不會刪除?Tag
?表中的記錄。
- 在 Django 中,多對多關系通過一個中間表來管理。當你刪除一個?
-
數據完整性:
- 標簽(
Tag
)通常是共享資源,可能被多個文章(Post
)使用。如果刪除某篇文章時也刪除了標簽,那么其他使用該標簽的文章就會受到影響。因此,Django 默認不會刪除標簽。
- 標簽(
Django admin后臺及創建超級賬號可參考:
Django 一對多關系-CSDN博客