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

news2025/4/4 9:22:57

文章目录

  • 安装
  • 一、数据库配置
  • 二、基本操作步骤
    • 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')

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

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

相关文章

SpringBoot日常:集成Kafka

文章目录 1、pom.xml文件2、application.yml3、生产者配置类4、消费者配置类5、消息订阅6、生产者发送消息7、测试发送消息 本章内容主要介绍如何在springboot项目对kafka进行整合,最终能达到的效果就是能够在项目中通过配置相关的kafka配置,就能进行消息…

RK3568 Android 13 内置搜狗输入法小计

问:为什么写? 答:网上搜出来的都试过了,不行!下面直接上代码和注意事项! 首先到这个目录(/RK3568/Rockchip_Android13_SDK_Release/device/rockchip/rk356x/tl3568_evm/preinstall&#xff09…

【opencv】第8章 图像轮廓与图像分割修复

8.1 查找并绘制轮廓 一个轮廓一般对应一系列的点,也就是图像中的一条曲线。其表示方法可能 根据不同的情况而有所不同。在OpenCV 中,可以用findContours()函数从二值图 像中查找轮廓 8.1.1 寻找轮廓: findContours() 函数 findContours) 函…

BGP 泄露

大家读完觉得有帮助记得关注和点赞!!! 目录 1. BGP 是什么? 2. 什么是 BGP 泄露? 3. 今天发生了什么? 4. 正常和被劫持状态下的路由示意图 5. 受影响区域 6. 责任在谁? 7. 有办法避免这…

数据结构与算法之二叉树: LeetCode 572. 另一棵树的子树 (Ts版)

另一棵树的子树 https://leetcode.cn/problems/subtree-of-another-tree/description/ 描述 给你两棵二叉树 root 和 subRoot检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树如果存在,返回 true ;否则,返回 false二叉树 tree …

动植物基因表达调控

1, on and off状态 以及表达的量 2, 基因调控的生物学影响? 超过400多种细胞类型,数目上37万亿 不是所有的基因都表达 为什么多核真核细胞需要基因调控? 单个细胞往多个细胞逐渐进化的过程,形成复杂的…

FreePBX 17 on ubuntu24 with Asterisk 20

版本配置: FreePBX 17(最新) Asterisk 20(最新Asterisk 22,但是FreePBX 17最新只支持Asterisk 21,但是21非LTS版本,所以选择Asterisk 20) PHP 8.2 Maria DB (v10.11) Node J…

“AI智能服务平台系统,让生活更便捷、更智能

大家好,我是资深产品经理老王,今天咱们来聊聊一个让生活变得越来越方便的高科技产品——AI智能服务平台系统。这个系统可是现代服务业的一颗璀璨明珠,它究竟有哪些魅力呢?下面我就跟大家伙儿闲聊一下。 一、什么是AI智能服务平台系…

Qt监控系统远程网络登录/请求设备列表/服务器查看实时流/回放视频/验证码请求

一、前言说明 这几个功能是近期定制的功能,也非常具有代表性,核心就是之前登录和设备信息都是在本地,存放在数据库中,数据库可以是本地或者远程的,现在需要改成通过网络API请求的方式,现在很多的服务器很强…

【网络协议】动态路由协议

前言 本文将概述动态路由协议,定义其概念,并了解其与静态路由的区别。同时将讨论动态路由协议相较于静态路由的优势,学习动态路由协议的不同类别以及无类别(classless)和有类别(classful)的特性…

安装完docker后,如何拉取ubuntu镜像并创建容器?

1. 先docker拉取ubuntu镜像 docker search ubuntu #搜索ubuntu 镜像 docker pull ubuntu:22.04 #拉取ubuntu 镜像 docker images #下载完成后,查看已经下载的镜像 docker run --name ubuntu_container -dit ubuntu:22.04 /bin/bash # docker container -l 2.…

互联网全景消息(10)之Kafka深度剖析(中)

一、深入应用 1.1 SpringBoot集成Kafka 引入对应的依赖。 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupI…

React Fiber框架中的Render渲染阶段——workLoop(performUnitOfWork【beginWork与completeWork】)

触发渲染过程——renderRoot renderRoot 是一个函数&#xff0c;用于触发渲染工作。它通常会调用并递归地执行一系列的渲染任务&#xff0c;直到完成整个更新过程。这个过程包括执行 Fiber 树中的 beginWork 和 completeWork&#xff0c;以及渲染新状态或 DOM。 function ren…

STM32F1学习——ADC模数转换器

一、ADC模数转换器 ADC的全称 Analog-Digital Converter 模拟-数字转换器&#xff0c;他可以用来将引脚上连续变换的模拟电压转换为内存中存储的数字变量。 ADC有两个重要指标&#xff0c;分辨率和频率。 STM32的ADC是 12位 逐次逼近型&#xff0c;1us转换时间&#xff0c;也就…

[每周一更]-(第131期):Go并发协程总结篇

Go语言的并发是通过协程&#xff08;goroutine&#xff09;实现的。Go协程是轻量级的线程&#xff0c;允许多个任务同时执行&#xff0c;且Go运行时会高效地管理它们。在Go中使用并发协程的方式非常简便&#xff0c;也很强大。以下是一些关于Go协程的基础用法和并发控制方法&am…

Ecdsa密钥在线生成工具

具体前往&#xff1a;ECC公钥私钥对在线生成器

llama.cpp 模型可视化工具 GGUF Visualizer

llama.cpp 模型可视化工具 GGUF Visualizer 1. GGUF Visualizer for VS Code (gguf-viz)1.1. Features1.2. Extension Settings References GGUF Visualizer https://marketplace.visualstudio.com/items?itemNameAgainstEntropy.gguf-viz 1. GGUF Visualizer for VS Code (g…

【DAPM杂谈之三】DAPM的初始化流程

本文主要分析DAPM的设计与实现 内核的版本是&#xff1a;linux-5.15.164&#xff0c;下载链接&#xff1a;Linux内核下载 主要讲解有关于DAPM相关的知识&#xff0c;会给出一些例程并分析内核如何去实现的 /**************************************************************…

HarmonyOS:@LocalBuilder装饰器: 维持组件父子关系

一、前言 当开发者使用Builder做引用数据传递时&#xff0c;会考虑组件的父子关系&#xff0c;使用了bind(this)之后&#xff0c;组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题&#xff0c;引入LocalBuilder装饰器。…

Pytorch导出onnx模型并在C++环境中调用(含python和C++工程)

Pytorch导出onnx模型并在C环境中调用&#xff08;含python和C工程&#xff09; 工程下载链接&#xff1a;Pytorch导出onnx模型并在C环境中调用&#xff08;python和C工程&#xff09; 机器学习多层感知机MLP的Pytorch实现-以表格数据为例-含数据集和PyCharm工程中简单介绍了在…