Django学习笔记之数据库(一)


文章目录

  • 安装
  • 一、数据库配置
  • 二、基本操作步骤
    • 1.增加
    • 2.查看
    • 3.排序
    • 4.更新
    • 5.删除数据
  • 三、一对多,多对多,一对一
    • 1.一对多
    • 1.一对一
    • 1.多对多
  • 四、查询操作
  • 五、聚合操作
  • 六、F和Q操作


安装

首先就是安装Mysql和Navicat。


一、数据库配置

其实整个就是连接前端和连后端,因此需要做后端配置,
首先在整体的setting.py 中找到DATABASES,然后修改到自己的配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':  'database_demo',
        'USER': 'root',
        'PASSWORD': 'admin',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }

然后添加自己的APP

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'home',
    'databasesdemo'
]

在urls.py中添加自己的App的Url的分段地址,这里是 path(‘databases/’,include(“databasesdemo.urls”)),前面是上一篇连接前端的

 # 分段地址
    path('movie/',include("movie.urls")),
    #########################
    path('home/',include("home.urls")),
    #########################
    path('databases/',include("databasesdemo.urls")),

在APP下的model.py写数据表所需的字段和需求

from django.db import models
class BookModel(models.Model):
    name = models.CharField(max_length=100)
    author = models.CharField(max_length=20)
    pub_time = models.DateTimeField(auto_now_add=True)
    price = models.FloatField(default=0)

在pycharm 终端中做迁移操作

python manage.py makemigrations

执行完这个后会出现
在这里插入图片描述
0001_initial.py这个文件
还是在终端做python manage.py migrate映射操作,从而迁移到数据库中

python manage.py migrate

在这里插入图片描述

二、基本操作步骤

1.增加

在所在App下的view.py中增加代码

def add_book(request):
    #books=BookModel(name='三国演义',author='罗贯中',price=100)
    books = BookModel(name='水浒传', author='施耐庵', price=99)
    books.save()
    return HttpResponse('图书插入成功')

urls.py连接一下前端路径

from django.urls import path
from . import views
#指定应用名称
app_name="databasesdemo"
urlpatterns = [
   path("databasebookadd/",views.add_book,name="databasebookadd"),
   ]

2.查看

在所在App下的view.py中查看代码

def query_book(request):
    #books=BookModel.objects.all()
    #books=BookModel.objects.filter(name='三国演义')
    #for book in books:
    #    print(book.id,book.name,book.author,book.pub_time,book.price)
   try:
    books = BookModel.objects.get(name='三国演义1')
    print(books.name)
   except BookModel.DoesNotExist:
       print("图书不存在")
   return HttpResponse('查找成功')

其中objects.filter和objects…all返回一个数组,因此,修改时候用get,删除时候用filter
urls.py连接一下前端路径

path("databasebookquery/",views.query_book,name="databasebookquery"),

3.排序

在所在App下的view.py中查看代码

def order_book(request):
    books=BookModel.objects.order_by("-pub_time")
    for book in books:
       print(book.id,book.name,book.author,book.pub_time,book.price)
    return HttpResponse('排序成功')

order_by(“pub_time”)为从小往大正序,order_by(“-pub_time”)为从大往小的倒序,只多一个负号就行

urls.py连接一下前端路径

 path("databasebookorder/",views.order_book,name="databasebookorder"),

4.更新

在所在App下的view.py中查看代码

def update_book(request):
    oldbook=BookModel.objects.get(name='三国演义')
    oldbook.name='西游记'
    oldbook.save()
    return  HttpResponse('修改成功')

这里就是get找到,然后替换

urls.py连接一下前端路径

path("databasebookupdate/",views.update_book,name="databasebookupdate"),

5.删除数据

代码如下(示例):

def delete_book(request):
    book=BookModel.objects.filter(name='西游记')
    book.delete()
    return  HttpResponse('删除成功')

urls.py连接一下前端路径

path("databasebookdelete/", views.delete_book, name="databasebookdelete"),

三、一对多,多对多,一对一

1.一对多

在model.py中定义两个表其中 Article中author,是User的外键

from django.db import models


class User(models.Model):
    username = models.CharField(max_length=20)
    password = models.CharField(max_length=100)

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='articles'

在view中定义关系

from django.shortcuts import render, HttpResponse
from django.db import connection
from datetime import datetime
from .models import User,Article
# Create your views here.
def article_test(request):
    user = User(username='张三',password='111111')
    user.save()
    # user = User.objects.first()
    article = Article(title='ChatGPT6',content='okk',author=user)
    article.save()
    return HttpResponse("添加成功")
    # article=Article.objects.first()
    # return HttpResponse(article.author.username)
def one_to_many(request):
    user = User.objects.first()
    #articles = user.articles.all()  # 使用 related_name='articles'
    articles = user.articles.filter(title__contains="Chat").all()
    for article in articles:
        print(article.title)
    return HttpResponse("一对多查询成功")

在这里插入图片描述
在这里插入图片描述
这里可以看到author_id是连接的外键

最后url.py

from django.urls import path
from . import views
#指定应用名称
app_name="article"
urlpatterns = [
    path("articletest",views.article_test,name="article_test"),
    path("one_to_many",views.one_to_many,name="one_to_many"),
]

1.一对一

class UserExtension(models.Model):
    birthday = models.DateTimeField(null=True)
    school=models.CharField(blank=True,max_length=50)
    user = models.OneToOneField('User', on_delete=models.CASCADE)

1.多对多

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.ForeignKey('User', on_delete=models.CASCADE, related_name='articles')
    tags = models.ManyToManyField('Tag',related_name='articles')

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

四、查询操作

__exact精确查找
__iexact忽略大小写
__contains包含查找
__icontains忽略大小写 包含查找
__in 容器为list迭代查找
__range 范围

def query1(request):
    # __exact精确查找
    #article=Article.objects.filter(id__exact=1)
    # __iexact忽略大小写
    #article=Article.objects.filter(title__iexact='chatgpt5')
    # __contains包含查找
    #article=Article.objects.filter(title__contains='GPT')
    # __icontains忽略大小写 包含查找
    article = Article.objects.filter(title__icontains='gpt')
    # __in 容器为list迭代查找
    #article = Article.objects.filter(id__in=[1,2,3])
    #__range 范围
    start_date = datetime(year=2024,month=12,day=20)
    end_date = datetime(year=2025, month=1, day=8)
    article = Article.objects.filter(pub_time__range=(start_date,end_date))
    # 查看执行的语句可以用query
    print(article.query)
    print(article)
    for index in article:
        print(index.title)
    return HttpResponse('查找成功T')

def query2(request):
    # 查找标题中,包含chat的文章的用户
    usr=User.objects.filter(articles__title__icontains='chat')
    for index in usr:
        print(index.id)
    print(usr.query)
    print(usr)
    return HttpResponse('查找成功T')

五、聚合操作

求平均值
result=Book.objects.aggregate(book_avg = Avg(‘price’))
求个数总和
result = Book.objects.aggregate(book_count = Count(‘id’))
求最大值最小值
result = Author.objects.aggregate(author_max=Max(‘age’),author_min=Min(‘age’))
都是.aggregate都在一个表里面折腾

from django.shortcuts import render
from django.db.models import Avg, Count, Max, Min, Sum
from django.shortcuts import render, HttpResponse
from .models import Book,BookOrder,Publisher,Author
# Create your views here.
def aggregate_view(request):
    #求平均值
    # result=Book.objects.aggregate(book_avg = Avg('price'))
    # 求个数总和
    # result = Book.objects.aggregate(book_count = Count('id'))
    # 求最大值最小值
    result = Author.objects.aggregate(author_max=Max('age'),author_min=Min('age'))
    print(result)
    return HttpResponse('MaxMin_view')

annotate会使用当前这个模型的主键进行分组,bookorder 是模型 BookOrder 的简称,Sum(“bookorder__price”) 会计算每个 Book 对象的所有相关 BookOrder 对象的 price 字段的总和。

def annotate_view(request):
    # 求分组总和
    result = Book.objects.annotate(total=Sum("bookorder__price")).values('name','total')
    print(result)
    return HttpResponse('Sum_view')

六、F和Q操作

filter 方法的条件语句需要使用 Q 对象来表示复杂查询(如逻辑或 OR 操作)。直接在 filter 中使用 Python 的 or 关键字是无效的,因为它不会被 Django 解析为 SQL 查询。

def q_view(request):
    books=Book.objects.filter(Q(price__gte=86)|Q(rating__gte=9)).all()
    for book in books:
        print(book.name,book.price,book.rating)
    return HttpResponse('q_view')

使用 F 对象和 update 方法可以直接在数据库层面进行批量更新,避免了将大量对象加载到内存中进行修改的性能开销。

def f_view(request):
    Book.objects.update(price=F('price')-10)
    return HttpResponse('f_view')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/952422.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《分布式光纤传感:架设于桥梁监测领域的 “智慧光网” 》

桥梁作为交通基础设施的重要组成部分,其结构健康状况直接关系到交通运输的安全和畅通。随着桥梁建设规模的不断扩大和服役年限的增长,桥梁结构的安全隐患日益凸显,传统的监测方法已难以满足对桥梁结构健康实时、全面、准确监测的需求。分布式…

什么是顶级思维?

在现代社会,我们常常听到“顶级思维”这个概念,但究竟什么才是顶级思维?它又是如何影响一个人的成功和幸福呢?今天,我们就来探讨一下顶级思维的几个关键要素,并分享一些实用的生活哲学。 1. 身体不适&…

更新Office后,LabVIEW 可执行程序生成失败

问题描述: 在计算机中,LabVIEW 开发的源程序运行正常,但在生成可执行程序时提示以下错误: ​ A VI broke during the build process from being saved without a block diagram. Either open the build specification to include…

Domain Adaptation(李宏毅)机器学习 2023 Spring HW11 (Boss Baseline)

1. 领域适配简介 领域适配是一种迁移学习方法,适用于源领域和目标领域数据分布不同但学习任务相同的情况。具体而言,我们在源领域(通常有大量标注数据)训练一个模型,并希望将其应用于目标领域(通常只有少量或没有标注数据)。然而,由于这两个领域的数据分布不同,模型在…

25年无人机行业资讯 | 1.1 - 1.5

25年无人机行业资讯 | 1.1 - 1.5 中央党报《经济日报》刊文:低空经济蓄势待发,高质量发展需的平衡三大关系 据新华网消息,2025年1月3日,中央党报《经济日报》发表文章指出,随着国家发展改革委低空经济发展司的成立&a…

AI刷题-数位长度筛选问题、数值生成与运算问题

目录 一、数位长度筛选问题 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 关键点 最终代码: 运行结果: 二、数值生成与运算问题 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤…

Qiskit快速编程探索(进阶篇)

五、量子电路模拟:探索量子世界的虚拟实验室 5.1 Aer模拟器:强大的模拟引擎 在量子计算的探索旅程中,Aer模拟器作为Qiskit的核心组件之一,宛如一座功能强大的虚拟实验室,为开发者提供了在经典计算机上模拟量子电路运行的卓越能力。它打破了硬件条件的限制,使得研究者无…

转运机器人在物流仓储行业的优势特点

在智能制造与智慧物流的浪潮中,一款革命性的产品正悄然改变着行业的面貌——富唯智能转运机器人,它以卓越的智能科技与创新的设计理念,引领着物流领域步入一个全新的高效、智能、无人的时代。 一、解放双手,重塑物流生态 富唯智能…

开源项目stable-diffusion-webui部署及生成照片

参考链接 https://www.freedidi.com/13133.html 基础环境部署 python 官网链接 Python Release Python 3.10.6 | Python.org 下载 Python 3.10.6 版本安装包 下载好后双击 点击安装,这里需要选择一下,把环境变量加上。(这里是默认安装到C盘…

Linux:进程概念(二.查看进程、父进程与子进程、进程状态详解)

目录 1. 查看进程 1.1 准备工作 1.2 指令:ps—显示当前系统中运行的进程信息 1.3 查看进程属性 1.4 通过 /proc 系统文件夹看进程 2. 父进程与子进程 2.1 介绍 2.2 getpid() \getppid() 2.3 fork()函数—通过系统调用创建进程 fork()函数疑问 3. 进程状态…

STM32 : PWM 基本结构

这张图展示了PWM(脉冲宽度调制)的基本结构和工作流程。PWM是一种用于控制功率转换器输出电压的技术,通过调整信号的占空比来实现对负载的精确控制。以下是详细讲解: PWM 基本结构 1. 时基单元 ARR (Auto-reload register): 自动…

ElasticSearch 认识和安装ES

文章目录 一、为什么学ElasticSearch?1.ElasticSearch 简介2.ElasticSearch 与传统数据库的对比3.ElasticSearch 应用场景4.ElasticSearch 技术特点5.ElasticSearch 市场表现6.ElasticSearch 的发展 二、认识和安装ES1.认识 Elasticsearch(简称 ES)2.El…

如何用 ESP32-CAM 做一个实时视频流服务器

文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用?GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…

UE5中制作地形材质

在创作大场景内容时,地形的设计和优化是至关重要的一步。利用UE中的地形系统,开发者能够高效地创建复杂的地形形态,同时保持游戏的性能和视觉效果。 1.在创建地形之前,先新建一个地形使用的混合材质球,添加节点Landsc…

通过 route 或 ip route 管理Linux主机路由

目录 一:route 使用说明1、查看路由信息2、删除指定路由3、增加指定路由 二:ip route 使用说明1、查看主机路由2、新增主机路由3、删除主机路由 通过route 或者ip route修改Linux主机路由后属于临时生效,系统重启后就恢复默认值了&#xff0c…

数据结构C语言描述11(图文结合)--二叉搜索树(BST树)的实现(数据采用KV存储形式进行封装)

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…

rabbitmq的三个交换机及简单使用

提前说一下,创建队列,交换机,绑定交换机和队列都是在生产者。消费者只负责监听就行了,不用配其他的。 完成这个场景需要两个服务哦。 1直连交换机-生产者的代码。 在配置类中创建队列,交换机,绑定交换机…

【数据库系统概论】第6章 (二)范式(重点讲在函数依赖范畴内)

目录 第一范式(1NF) 第二范式(2NF) 第三范式(3NF) BC范式(BCNF) 多值依赖 第四范式(4NF) 范式(Normalization) 是一种结构化的设…

Supermaven 加入 Cursor:AI 编码新篇章

引言 2024 年 11 月 11 日,我们迎来了一个激动人心的时刻——Supermaven 正式加入 Cursor! 这一合作标志着 AI 编程工具进入了一个新的发展阶段,为开发者提供更智能、更高效的编码体验。本文将带您了解此次合并的背景、意义以及未来的发展方…

通信与网络安全管理之ISO七层模型与TCP/IP模型

一.ISO参考模型 OSI七层模型一般指开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。 它从低到高分别是…