Django 一对多关系

news2024/12/23 9:17:17

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.coloradmin.cn/o/1883970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装KB5039212更新卡在25% 或者 96% 进度

系统之家7月1日消息&#xff0c;微软在6月11日的补丁星期二活动中&#xff0c;为Windows 11系统推出了KB5039212更新。然而&#xff0c;部分用户在Windows社区中反映&#xff0c;安装过程中出现失败&#xff0c;进度条在25%或96%时卡住。对于遇到此类问题的Windows 11用户&…

YOLOv8改进 | 主干网络 | C2f融合动态卷积模块ODConv

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容&#xff0c;内含各种Head检测头、损失函数Loss、…

Linux CentOS 7 离线安装.NET环境

下载 下载.NET 例如&#xff1a; aspnetcore-runtime-6.0.15-linux-x64.tar.gz 复制 复制到如下目录&#xff1a; /usr/local/dotnet/aspnetcore-runtime-6.0.15-linux-x64.tar.gz 解压 cd /usr/local/dotnet/ tar -zxvf aspnetcore-runtime-6.0.15-linux-x64.tar.gz 创建…

非标设备行业的数智化项目管理

近年来&#xff0c;中国制造快速发展&#xff0c;企业迫切需要加快转型升级。与传统制造业相比&#xff0c;高端制造业具有明显的优势&#xff1a;高技术、高附加值、低污染、低排放、竞争优势强。一方面&#xff0c;企业对于生产效率和自动化水平的要求不断提高&#xff0c;期…

esp12实现的网络时钟校准

网络时间的获取是通过向第三方服务器发送GET请求获取并解析出来的。 在本篇博客中&#xff0c;网络时间的获取是一种自动的行为&#xff0c;当系统成功连接WiFi获取到网络天气后&#xff0c;系统将自动获取并解析得到时间和日期&#xff0c;为了减少误差每两分钟左右进行一次校…

qt可点击的QLabel

需求——问题与思路 使用wpf实现一个可点击的超链接label相当简单&#xff08;如下图&#xff09;&#xff0c;但是qt的QLabel不会响应点击事件&#xff0c;那就从QLabel继承一个类&#xff0c;然后在该类中重写mousePressEvent函数&#xff0c;并在该函数中对左键点击事件做响…

人工智能——常用数学基础之线代中的矩阵

1. 矩阵的本质&#xff1a; 矩阵本质上是一种数学结构&#xff0c;它由按照特定规则排列的数字组成&#xff0c;通常被表示为一个二维数组。矩阵可以用于描述一组数据&#xff0c;或者表示某种关系&#xff0c;比如线性变换。 在人工智能中&#xff0c;矩阵常被用来表示数据集…

沉浸感拉满的三模游戏外设神器!谷粒金刚3 Pro游戏手柄开箱试玩

沉浸感拉满的三模游戏外设神器&#xff01;谷粒金刚3 Pro游戏手柄开箱试玩 哈喽小伙伴们好&#xff0c;我是Stark-C~ 对于喜欢打游戏的玩家来说&#xff0c;一款得力的游戏外设绝对是提升游戏体验&#xff0c;增加游戏乐趣的重要神器&#xff01;而在众多的外设中&#xff0c…

全同态加密在大模型应用中应用

密码学简介 上文的图例基本展示了常见加密体系。加密体系&#xff0c;如果用比较正式的描述方法&#xff0c;无疑是做了三件事&#xff1a; 首先&#xff0c;通过一个生成算法 &#x1d43e;&#x1d452;&#x1d466;&#x1d43a;&#x1d452;&#x1d45b;(1&#x1d70…

32.哀家要长脑子了!

1.299. 猜数字游戏 - 力扣&#xff08;LeetCode&#xff09; 公牛还是挺好数的&#xff0c;奶牛。。。妈呀&#xff0c;一朝打回解放前 抓本质抓本质&#xff0c;有多少位非公牛数可以通过重新排列转换公牛数字&#xff0c;意思就是&#xff0c;当这个数不是公牛数字时&#x…

ctfshow web入门 sqli-libs web552--web560

web552 宽字节注入 嗯原理我就不讲了&#xff0c;还是有点复杂后面有时间讲讲 总而言之就是用汉字把\的转义作用抵消了然后正常注入即可 ?id-1包 union select 1,2,3--?id-1包union select 1,(select group_concat(table_name) from information_schema.tables where tab…

ChatGPT-4o医学应用、论文撰写、数据分析与可视化、机器学习建模、病例自动化处理、病情分析与诊断支持

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年11月7日&#xff0c;OpenAI首届开发者大会被称为“科技界的春晚”&#xff0c;吸引了全球广大…

如何使用pytest组织自动化测试用例结构?

如何组织自动化测试工程的目录结构&#xff1f;这篇文章介绍了我是如何组织整个自动化工程目录结构的&#xff0c;本篇介绍下我是如何利用pytest框架组织一个测试用例文件的。 用例文件组织原则 整个testsuite目录下整体上按照特性模块划分目录&#xff0c;每个目录下可以只包…

Python容器 之 列表--下标和切片

列表的切片 得到是 新的列表字符串的切片 得到是 新的字符串 如果下标 不存在会报错 list1 [1, 3.14, "hello", False] print(list1)# 获取 列表中 第一个数据 print(list1[0]) # 1# 获取列表中的最后一个数据 print(list1[-1]) # [False]# 获取中间两个数 即 3.1…

币界网快讯,比特币7月份看牛预测

今日数字货币市场全面开启反弹&#xff0c;比特币从 60,000 美元大关飙升至 63,700 美元&#xff0c;预示着 7 月牛市的到来。在此之前&#xff0c;上周曾短暂跌破 60,000 美元&#xff0c;但受到 BTC 现货 ETF 流入的 7,300 万美元的推动——这是两周以来最大的流入。 BTC价格…

Linux下SUID提权学习 - 从原理到使用

目录 1. 文件权限介绍1.1 suid权限1.2 sgid权限1.3 sticky权限 2. SUID权限3. 设置SUID权限4. SUID提权原理5. SUID提权步骤6. 常用指令的提权方法6.1 nmap6.2 find6.3 vim6.4 bash6.5 less6.6 more6.7 其他命令的提权方法 1. 文件权限介绍 linux的文件有普通权限和特殊权限&a…

Redis基础教程(六):redis 哈希(Hash)

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

【火猫】cs2 donk登顶2024年上半年ADR榜

1、HLTV发布数据统计&#xff0c;donk以55张地图中96.8的ADR成功登顶上半年ADR榜单第一。紧随其后的是法国巨星ZywOo&#xff0c;以68图89.2的ADR排名第二。G2当家狙击手m0NESY以73图85的ADR排名第三。 2、白俄罗斯爆料人harumi透露&#xff1a;“Falcons战队向BOROS支付了6个月…

每日复盘-20240701

今日关注&#xff1a; 20240701 六日涨幅最大: ------1--------301182--------- 凯旺科技 五日涨幅最大: ------1--------300977--------- 深圳瑞捷 四日涨幅最大: ------1--------300977--------- 深圳瑞捷 三日涨幅最大: ------1--------300461--------- 田中精机 二日涨幅最…

科普:电脑硬件挑选

目录 一cpu 二主板 三内存 四硬盘 五显卡&#xff0c;散热&#xff0c;电源&#xff0c;机箱 六个人配置 一cpu 品牌&#xff1a;intel AMD 型号&#xff1a;I3,I5,I7 R7等 代数&#xff1a;换新不换旧 cpu后缀&#xff1a;k&#xff08;可超频&#xff09;f&#xf…