Django学习笔记二:数据库操作详解

news2024/10/6 5:39:49

Django框架提供了一个功能强大的ORM(对象关系映射)系统,使得开发者可以使用Python代码来操作数据库,而无需编写复杂的SQL语句。以下是Django数据库操作的一些基本概念和方法:
在这里插入图片描述

模型定义

在Django中,模型是对数据库表的抽象。每个模型都是一个Python类,继承自django.db.models.Model。模型中的每个属性都对应数据库表中的一个字段。

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)

数据库迁移

当你定义或修改了模型后,需要创建迁移文件,并将这些变更应用到数据库中。

  • 创建迁移文件:
    python manage.py makemigrations
    
  • 应用迁移到数据库:
    python manage.py migrate
    

CRUD操作

  • 创建:创建一个新的记录。
    blog = Blog(title='My first blog', content='This is my first blog post.')
    blog.save()
    
  • 读取:查询数据库中的记录。
    blogs = Blog.objects.all()  # 获取所有记录
    blog = Blog.objects.get(id=1)  # 获取特定记录
    
  • 更新:修改已存在的记录。
    blog = Blog.objects.get(id=1)
    blog.title = 'My updated blog'
    blog.save()
    
  • 删除:删除记录。
    blog = Blog.objects.get(id=1)
    blog.delete()
    

查询集(QuerySet)

QuerySet是Django ORM返回的一种数据结构,用于表示数据库查询的结果集。它支持链式调用,可以进行过滤、排序、限制等操作。

  • 过滤:
    blogs = Blog.objects.filter(title__contains='Django')
    
  • 排除:
    blogs = Blog.objects.exclude(is_published=False)
    
  • 排序:
    blogs = Blog.objects.order_by('pub_date')
    
  • 限制:
    blogs = Blog.objects.all()[:10]  # 获取前10条记录
    

复杂查询

Django ORM支持更复杂的查询操作,如关联查询、聚合查询等。

  • 关联查询:
    from django.db.models import Count
    author_count = Author.objects.annotate(book_count=Count('book')).filter(book_count__gt=1)
    
  • 聚合查询:
    from django.db.models import Avg
    average_book_count = Author.objects.aggregate(avg_books=Avg('book__count'))
    

使用原生SQL

虽然Django ORM非常强大,但在某些情况下,你可能需要执行原生SQL语句。

  • 使用raw()方法:
    blogs = Blog.objects.raw('SELECT * FROM myapp_blog WHERE title LIKE "%Django%"')
    
  • 使用cursor()方法:
    from django.db import connection
    with connection.cursor() as cursor:
        cursor.execute('SELECT * FROM myapp_blog WHERE title LIKE %s', ['%Django%'])
        blogs = cursor.fetchall()
    

注意事项

  • 尽量使用Django ORM提供的抽象方法来操作数据库,这样可以保证代码的可读性和数据库的兼容性。
  • 当使用原生SQL时,需要特别注意SQL注入的风险。
  • 在进行数据库操作时,应该注意异常处理,避免因为数据库操作导致程序崩溃。

以上是Django数据库操作的一些基本概念和方法,更多详细信息可以参考Django的官方文档。

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

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

相关文章

大模型基础:基本概念、Prompt、RAG、Agent及多模态

随着大模型的迅猛发展,LLM 作为人工智能的核心力量,正以前所未有的方式重塑着我们的生活、学习和工作。无论是智能语音助手、自动驾驶汽车,还是智能决策系统,大模型都是幕后英雄,让这些看似不可思议的事情变为可能。本…

Spring源码-AOP具体源码

1.类ProxyFactory 核心方法:getProxy 1.DefaultAopProxyFactory#createAopProxy 判断使用JDK还是CGLIB动态代理的代码如下: Override public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {// 如果ProxyFactory的isOp…

北京市大兴区启动乐享生活 寻味大兴 美食嘉年华 系列促销费活动

北京市大兴区启动乐享生活 寻味大兴 系列促销费活动 区商务局副局长 兰莉 致开幕辞 区餐饮行业协会会长 董志明 介绍活动内容 2024年9月30日,由大兴区商务局主办、大兴区餐饮行业协会承办,并得到高米店街道和大兴绿地缤纷城大力支持的“乐享生活 寻味大…

快速排序的非递归实现:借助栈实现、借助队列实现

目录 用栈实现快速排序 1.用栈实现非递归快速排序的思路步骤 1.1.思路步骤 2.用栈实现非递归快速排序的代码 3.用栈实现非递归快速排序的整个工程 3.1.QuickSortNonR.h 3.2.QuickSortNonR.c 3.3.Stack.h 3.4.Stack.c 用队列实现非递归快速排序 1.用队列实现非递归快…

进程概念 | 进程状态 | 进程优先级

进程的基本概念 课本概念:程序的一个执行实例,正在执行的程序等。核心观点:担当分配系统资源(cpu时间、内存)的实体。 资源占用 它占用系统资源向CPU时间,内存等不同进程的资源是相互隔离的,确…

Linux中swap分区

swap 分区的创建方法演示: 方法1:fdisk (首先查看 fdisk /dev/sda 中 swapID。由于 Linux 的 fdisk 默认会将分区的 ID 设置为 Linux 的文件系统,所以需要设置一下 systemID) 解决方法 重启或者执行命令 第二个交换分…

主机可以ping通linux虚拟机但linux虚拟机无法ping通主机的解决办法

出现这个问题一般是由于物理主机的防火墙挡住了ping包,可以试试看把主机的防火墙关闭看看 如果可以ping通的话那么试试看添加规则将虚拟机ip添加进去 高级设置,入站规则,新建规则 下列ip地址添加虚拟机的ip地址(使用桥接网络&…

修改Anaconda虚拟环境默认安装路径(Linux系统)

文章目录 修改Anaconda虚拟环境默认安装路径(Linux系统)1.方法一:使用--prefix参数2.方法二:配置conda环境的默认安装位置 修改Anaconda虚拟环境默认安装路径(Linux系统) 1.方法一:使用--prefix参数 在创建虚拟环境时,使用--pre…

Vue3 中Ref的最佳实践

在vue3中如果我们需要获取一个响应式的变量,可以使用ref来定义一个变量。 const name ref( "" );name.value "test" 定义好后,就可以实现修改状态,更新UI的效果了。 在这个基础上,本文主要讨论跨组件时如何…

基于STM32的智能风扇控制系统设计

引言 本项目将基于STM32微控制器设计一个智能风扇控制系统,通过温度传感器实时检测环境温度,并根据预设的温度范围自动调节风扇的转速。该系统展示了STM32的PWM输出、传感器接口以及自动控制应用的实现。 环境准备 1. 硬件设备 STM32F103C8T6 开发板…

Python 语言学习——应用1.1 数字图像处理(第一节,颜色)

目录 1.基础知识 2.实战演示 1.基础知识: 1.图像的表示. 函数表示:图像是二维信号,定义为二维函数f(x,y),其中,x、y是空间坐标,f(x,y)是点(x,y)的幅值。拓展看,视频,又称动态图像…

SOMEIP_ETS_166: SD_TestFieldUINT8

测试目的: 验证DUT能够通过Getter和Setter方法正确地发送和接收TestFieldUINT8字段的值。 描述 本测试用例旨在确保DUT的ETS能够响应Tester的请求,正确地使用Getter方法获取TestFieldUINT8的值,以及使用Setter方法设置新的值。 测试拓扑&…

QGIS中怎么加载数据(如矢量shp与栅格数据)

最近有不少初学者来问我qgis里怎么加载数据 这个与arcgis中的操作其实也是类似的,也是通过软件的里面+号就行了 下面是我对这个问题的解决思路: 一种是直接把图层文件拖进去,但是这种方法很有局限性,下面我还说明一…

JavaWeb的小结02

第2章-第2节 一、知识点 HttpServletRequest请求对象、HttpServletResponse响应对象、响应内容类型Content-Type、请求转发、重定向、ServletContext对象。 二、目标 深刻理解HttpServletRequest对象的作用。 深刻理解HttpServletResponse对象的作用。 掌握HttpServletRequ…

什么是请求转发?

请求转发 解释 请求转发,将前端发送的请求转发到别的资源 别的资源是指: servlet,页面 即: 请求转发,可以将请求转发值另外一个servlet;也可以是将请求转发至页面 1、 请求转发演示 1.1 请求转发跳转页面 实战: 之前注册练习,修改: 实现注册完跳转到登录页面 1.2 请求转发…

【Matlab案例】imageJ + matlab 实现物体轨迹追踪及路径彩色上色

我们经常看到一些文献中对细胞或者粒子的运动轨迹进行上色,不同的颜色对应着不同的时间。一纯色的轨迹实现起来很方便,彩色的轨迹如何实现呢?本文使用imageJ获取轨迹数据,使用matlab对轨迹进行上色。结果如下: 1. im…

Java | Leetcode Java题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; class Solution {public boolean circularArrayLoop(int[] nums) {int n nums.length;for (int i 0; i < n; i) {if (nums[i] 0) {continue;}int slow i, fast next(nums, i);// 判断非零且方向相同while (nums[slow] * nums[fast]…

Python爬虫(二)--http基本原理(Python Crawler (2) Basic Principles of HTTP)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

TriLite完成A轮扩展融资:加速AR微型投影仪技术创新与市场拓展

近日,全球领先的AR微型投影仪开发商TriLite宣布成功完成A轮扩展融资,将A轮融资总额提升至超过2000万欧元。这一轮融资不仅彰显了资本市场对TriLite技术实力和市场潜力的高度认可,更为其后续在AR微型投影仪领域的技术研发、产品迭代以及市场拓展提供了坚实的资金保障。以下是…

力扣刷题 | 两数之和

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 给定一个整数数组 nums 和…