Django 一对多关系

news/2024/7/8 3:56:13 标签: django, python, 后端

django-项目和应用">1,创建 Django 应用

Test/app9

django-admin startapp app9

2,注册应用

Test/Test/settings.py

3,添加应用路由

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('app1/', include('app1.urls')),
    path('app2/', include('app2.urls')),
    path('app3/', include('app3.urls')),
    path('app4/', include('app4.urls')),
    path('app5/', include('app5.urls')),
    path('app6/', include('app6.urls')),
    path('app7/', include('app7.urls')),
    path('app8/', include('app8.urls')),
    path('app9/', include('app9.urls')),
]

 4,添加模型

Test/app9/models.py

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')

    def __str__(self):
        return self.title

5,注册模型到admin

Test/app9/admin.py

from django.contrib import admin
from .models import Author, Book

admin.site.register(Author)
admin.site.register(Book)

5.1 创建超级账号

python manage.py createsuperuser

按照提示输入用户名、邮箱和密码。

5.2 通过admin管理后台添加数据

http://127.0.0.1:8000/admin/
http://127.0.0.1:8000/admin/login/?next=/admin/

添加作者

  • 点击 "Authors"。
  • 点击右上角的 "Add Author"。
  • 输入作者名称,例如 "小强"。
  • 点击 "Save"。

添加书籍

  • 点击 "Books"。
  • 点击右上角的 "Add Book"。
  • 输入书名,例如 "java入门到弃坑233"。
  • 在 "Author" 字段选择刚才添加的作者 "小强"。
  • 点击 "Save"。
  • 重复以上步骤添加更多书籍,例如 "学习msql"。

查看数据库:

app9_author表,id 为2的作者小强,关联app9_book表author_id为2的两本书籍,建立了一对多的关系

5.3 执行py脚本实例化添加数据

Test/populate_data.py

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Test.settings')
django.setup()

from app9.models import Author, Book

# 清空现有数据
Author.objects.all().delete()
Book.objects.all().delete()

# 添加作者和书籍
author1 = Author.objects.create(name="小强")
Book.objects.create(title="Django 从入门到入坑", author=author1)
Book.objects.create(title="pyhton 从入门到入坑", author=author1)

author2 = Author.objects.create(name="小龙")
Book.objects.create(title="C++ 从入门到入坑", author=author2)
Book.objects.create(title="java 从入门到入坑", author=author2)

print("数据添加成功!")

查看管理台:

查看数据库:

6,添加视图函数

 Test/app9/views.py

from django.shortcuts import render, get_object_or_404
from .models import Author, Book

def author_list(request):
    authors = Author.objects.all()
    return render(request, '9/author_list.html', {'authors': authors})

def author_detail(request, author_id):
    author = get_object_or_404(Author, pk=author_id)
    return render(request, '9/author_detail.html', {'author': author})

7,添加html代码

 Test/templates/9/author_list.html

<!DOCTYPE html>
<html>
<head>
    <title>Authors</title>
</head>
<body>
    <h1>Authors</h1>
    <ul>
        {% for author in authors %}
            <li><a href="{% url 'author_detail' author.id %}">{{ author.name }}</a></li>
        {% endfor %}
    </ul>
</body>
</html>

Test/templates/9/author_detail.html

<!DOCTYPE html>
<html>
<head>
    <title>{{ author.name }}</title>
</head>
<body>
    <h1>{{ author.name }}</h1>
    <h2>Books</h2>
    <ul>
        {% for book in author.books.all %}
            <li>{{ book.title }}</li>
        {% endfor %}
    </ul>
    <a href="{% url 'author_list' %}">Back to Authors</a>
</body>
</html>

8,添加路由地址

Test/app9/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('authors/', views.author_list, name='author_list'),
    path('authors/<int:author_id>/', views.author_detail, name='author_detail'),
]

9,访问页面

http://127.0.0.1:8000/app9/authors/

 点击作者小强,可以看到他名下的书籍

10,删除作者和书籍

10.1 添加删除视图函数

Test/app9/views.py

from django.shortcuts import render, get_object_or_404
from .models import Author, Book

def author_list(request):
    authors = Author.objects.all()
    return render(request, '9/author_list.html', {'authors': authors})

def author_detail(request, author_id):
    author = get_object_or_404(Author, pk=author_id)
    return render(request, '9/author_detail.html', {'author': author})


# 删除书籍
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages

from .models import Author, Book

def delete_author(request, author_id):
    author = get_object_or_404(Author, pk=author_id)

    if request.method == 'POST':
        author.delete()
        messages.success(request, '作者已成功删除!')
        return redirect('author_list')  # 重定向到作者列表视图

    return render(request, '9/confirm_delete_author.html', {'author': author})


10.2 添加删除html模版

Test/templates/9/confirm_delete_author.html

<h1>确认删除作者</h1>
<p>你确定要删除 "{{ author.name }}" 吗?</p>
<form method="POST">
    {% csrf_token %}
    <button type="submit">确认删除</button>
    <a href="{% url 'author_list' %}">取消</a>
</form>

10.3 给列表html添加删除按钮

Test/templates/9/author_list.html

<!DOCTYPE html>
<html>
<head>
    <title>Authors</title>
</head>
<body>
    <h1>Authors</h1>
    <ul>
        {% for author in authors %}
            <li><a href="{% url 'author_detail' author.id %}">{{ author.name }}</a></li>
        {% endfor %}
    </ul>



    <ul>
        {% for author in authors %}
            <li>
                {{ author.name }}
                <a href="{% url 'delete_author' author.id %}">删除</a>
            </li>
        {% endfor %}
    </ul>



</body>
</html>

10.4 添加路由地址

Test/app9/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('authors/', views.author_list, name='author_list'),
    path('authors/<int:author_id>/', views.author_detail, name='author_detail'),

    path('delete_author/<int:author_id>/', views.delete_author, name='delete_author'),
]

10.5 访问页面

 http://127.0.0.1:8000/app9/authors/

对比数据库删除前后,可以看到与小强关联的两本书,在删除作者小强后也被一并删除了。


http://www.niftyadmin.cn/n/5536359.html

相关文章

python遍历目录下所有文件

python遍历目录下所有文件 方法1&#xff1a;使用os.walk()函数递归遍历目录下所有文件。方法2&#xff1a;使用os.scandir()函数遍历目录下所有文件。方法3&#xff1a;使用os.listdir()函数遍历目录下所有文件。方法4&#xff1a;使用glob模块遍历目录下所有文件。方法5&…

嵌入式上gst rtsp server opencv mat

0 安装gstreamer sudo apt install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-…

谷粒商城笔记-03-分布式基础概念

文章目录 一&#xff0c;微服务二&#xff0c;集群、分布式三&#xff0c;远程调用四&#xff0c;负载均衡五&#xff0c;服务注册、服务发现、注册中心六&#xff0c;配置中心七&#xff0c;服务熔断、服务降级1&#xff0c;服务熔断2&#xff0c;服务降级3&#xff0c;区别 八…

开始尝试从0写一个项目--后端(一)

创建文件的目录结构 利用这个界面创建 序号 名称 说明 1 SEMS maven父工程&#xff0c;统一管理依赖版本&#xff0c;聚合其他子模块 2 sems-common 子模块&#xff0c;存放公共类&#xff0c;例如&#xff1a;工具类、常量类、异常类等 3 sems-pojo 子模块&#x…

怎么用AI合成PPT?这5款风靡全球的AIPPT软件一定要知道!

当下我们已进入信息过载的时代&#xff0c;每天有无数的信息试图争夺我们的注意力&#xff0c;与此同时&#xff0c;我们也需要向别人展示和呈现信息&#xff0c;这就要求我们能够以最低的成本&#xff0c;在短时间内引起对方的注意&#xff0c;这其中最常用到的工具非PPT莫属。…

[前端架构]微前端原理了解

微前端原理简介 大致方案 Nginx路由转发iframe嵌套Web Components组合式应用路由分发 实际项目中&#xff0c;一般是Nginx路由转发搭配某个微前端框架实现&#xff0c;而微前端框架又是由上面几种技术一些补充混合实现的。 例如&#xff1a; qiankun: function proxy wi…

Pand函数详解进阶:案例解析(第26天)

系列文章目录 分组对象操作分组聚合分组转换分组过滤分箱合并操作变形操作 文章目录 系列文章目录前言1 分组对象操作2 分组聚合2.1 df分组对象直接调用聚合函数2.2 df分组对象指定聚合列2.3 df分组对象结合agg函数 3 分组转换4 分组过滤5 分箱6 合并操作6.1 纵向合并6.2 横向合…

学习python常用的英语单词,有音标,有音节划分,适合英语基础差的人来入门

if [ɪf] 如果 else [els] 否则 while [waɪl] 当...的时候 for [fɔ:r] “对于”或“遍历”&#xff0c;适合于 break [brek] 中断 continue [kəntɪnju:] 继续 con ti nue [kən tɪ nju:] pass [pɑ:s] 通过 height [haɪt] 高度 weight [weɪt] 重量 keyword [ki:w…