首页 > 其他分享 >Django 多对多关系

Django 多对多关系

时间:2024-07-02 21:56:14浏览次数:30  
标签:关系 标签 app10 list Django Test import post

多对多关系作用

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, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('app9.urls')),
    # ...
    path('app10/', include('app10.urls')),
]


5,添加模型

Test/app10/models.py

from django.db import models

class Tag(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()
    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 Post

def 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 views

urlpatterns = [
    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 Post

def 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 Post

def 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 views

urlpatterns = [
    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博客

标签:关系,标签,app10,list,Django,Test,import,post
From: https://blog.csdn.net/qq_26086231/article/details/140136658

相关文章

  • Django3在网页上生成二维码
    1.安装包pipinstalldjango-qr-code2.在django项目的settings.py中,安装app打开项目的settings.py,找到INSTALLED_APPS,在这里增加一条'qr_code'INSTALLED_APPS=[...,'rest_framework','qr_code',...]3.在渲染的html文件中,导入模板{%loadqr_co......
  • 57.Django框架之序列化输出
    Django框架【一】序列化组件1)使用案例在前端获取到后端用户表里面的所有数据,并且格式是列表套字典#创建模型表classUser(models.Model): username=models.CharField(max_length=32,verbose_name="姓名")age=models.IntegerField(verbose_name="年龄")2)基于J......
  • 一秒即懂财务报表勾稽关系
    财务报表的勾稽关系!审计!审计试算平衡!算平衡表!项目经理!财务总监!会计!出纳6财务报表勾稽关系属于会计做账是否正确的要且快速的方法!6财务人员对外提供报表是非常正常且频繁的情,股东要求,税局纳税申报,发行股票,发券,公司年度总结等等场合。6而实际现状是,许多老板并不精通财务,看懂财务报......
  • PaddleNLP UIE 实体关系抽取
    目录环境依赖配置SSH克隆代码训练定制代码结构数据标注准备语料库数据标注导出数据数据转换doccanoLabelStudio模型微调问题处理找不到'paddlenlp.trainer'找不到GPUprotobuf==3.20.2CUDA/cuDNN/paddlePaddleNLPUIE实体关系抽取PaddlePaddle用户可领取免费TeslaV100在线算......
  • WMS、ERP、MES之间的关系
    WMS(仓库管理系统)、ERP(企业资源计划)、MES(制造执行系统)是企业管理和运作中常见的三种系统,它们在不同的层面上发挥作用,但之间又有紧密的联系。三者之间的区别如下:1):WMS→主要功能:管理和优化仓库的日常运营,包括库存管理、货位管理、入库/出库流程、盘点、物流等。→应用场景:主......
  • PART1-Oracle关系数据结构
    2.Oracle关系数据结构2.1.表和表簇2.1.1.模式对象简介数据库模式是数据结构的逻辑容器,这些数据结构称为模式对象。模式对象的例子有表和索引。模式对象是通过SQL创建和操作的。一个数据库用户拥有密码和各种数据库权限。每个用户拥有一个与其同名的模式。模式包含了属于......
  • day33-Django3.2(二)
    四、视图django的视图主要有2种,分别是函数视图和类视图.现在刚开始学习django,我们先学习函数视图(FBV),后面再学习类视图[CBV].4.1、请求方式web项目运行在http协议下,默认肯定也支持用户通过不同的http请求发送数据来。django支持让客户端只能通过指定的Http请求来访问到项......
  • Django之文件上传
    前端 <!DOCTYPEhtml><html><body><h2>UploadFile</h2><formaction="http://127.0.0.1:5000/upload"method="post"enctype="multipart/form-data">Selectfiletoupload:<inputtype=&q......
  • 6、Django-管理员界面-admin
    概念:Django的admin界面是自动生成的,它根据你的模型类自动创建表单和列表视图。你只需将模型类注册到admin界面,就可以轻松地管理和操作数据库中的数据。admin界面提供了各种功能,包括:列表视图:以表格形式展示数据库中的数据,支持分页、搜索和排序功能,方便快速浏览和筛选数据。表......
  • 5、Django-模型-models
    概念:基本模板:模板其实就是我们使用的HTML写好的页面--先在应用的目录下创建模板文件夹templates、然后在templates中创建模板文件、如html--最后在views.py中去渲染模板、使用render函数将模板返回给用户:returnrender(request,'.html')  定义模板:--模板里就是要对......