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

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

模型定义

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

from django.db import modelsclass 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.rhkb.cn/news/440227.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两数相除(c语言)

1.//给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。 //整数除法应该向零截断,也就是截去(truncate)其小数部分。 // 例如,8.345 将被截断为 8 ,…

内网穿透工具ngrok

写作背景 最近在公司内购淘了个MAC电脑,想当个Linux服务器起Docker搭建环境用,现在问题是如何在公网上能访问到MAC这个机器上的资源。 之前写了一篇文章Mac当作云服务器,你真的会搞吗 最近想重启一下这台老伙计了,发现ngrok还是…

视频加字幕用什么软件最快?12款工具快速添加字幕!

对于大多数同学来讲,剪辑中比较头疼的就是如何给视频加字幕和唱词啦,特别是用Pr或者FCXP等专业剪辑软件,加字幕也是特别费时的,哪怕是有批量添加的功能orz... 虽然关于这方面的内容已经很多啦,但是真正全面的内容还特…

VTC视频时序控制器,TPG图像测试数据发生器,LCD驱动——FPGA学习笔记19

详情可以见LCD篇 LCD彩条显示——FPGA学习笔记10_依次显示红绿蓝三个通道-CSDN博客 一、VTC简介 Video Timing Controller 缩写 VTC 是我们在所有涉及 FPGA 图像、 FPGA 视频类方案中经常用到的一种用于产生视频时序的控制器。 本课以 VGA 为切入点, 学习视频传输…

[Linux]:线程(三)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. POSIX 信号量 1.1 信号量的概念 为了解决多执行流访问临界区&#xff0c…

基于SpringBoot+Vue的酒店客房管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

[SAP ABAP] 程序调用

示例数据 学生表(ZDBT_STU_437) 程序: Z437_TEST_20241006 代码如下所示 REPORT Z437_TEST_20241006.* 创建跟表或结构同名的工作区 TABLES: zdbt_stu_437.SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.PARAMETERS: p_1 TYPE c LENGTH 4.SELECT-O…

Kali或Debian系统安装JDK1.8保姆级教程

一、下载JDK1.8 先到Oracle的官网下载JDK1.8 Java Archive | Oraclehttps://www.oracle.com/java/technologies/downloads/archive/Java Archive Downloads - Java SE 8

CUDA、Pytorch、Pycharm的安装与配置

文章目录 一、CUDA安装1.检查英伟达驱动支持的最高CUDA版本 二、Pytorch的安装与环境配置1.选择是下载CPU版本还是GPU版本2.上Pytorch官网找到安装命令3.运行指令(1)CPU版本(2)GPU版本 4.验证5.安装其他所需模块(0)安装torch(1)安装Matplotlib(2)安装 pillow(可能an…

OSPF的不规则区域

1.远离骨干非骨干区域 2.不连续骨干 解决方案 tunnel ---点到点GRE 在合法与非ABR间建立隧道,然后将其宣告于OSPF协议中; 缺点:1、周期和触发信息对中间穿越区域造成资源占用(当同一条路由来自不同区域,路由器会先…

javaScript基础(8个案例+代码+效果图)

目录 1.js常用的输出语句 案例:js初体验 1.代码 2.效果 2.js命名规则 3.js赋值 var 关键字声明变量 案例:交换两个变量的内容 完整代码 效果 4.js数据类型 布尔类型 整数 浮点数 字符串 空型 未定义型 5. 数据检测 6.算术运算符 7.比较运算符 案例:计算圆周长和面积 1.代码 2.…

【游戏模组】重返德军总部2009高清重置MOD,建模和材质全部重置,并且支持光追效果,游戏画质大提升

各位好,今天小编给大家带来一款新的高清重置MOD,本次高清重置的游戏叫《重返德军总部2009》2009年发布,我相信很多玩家已经玩过了,如果你还没有玩过我也可以和你简单介绍一下剧情,这款游戏故事背景接续在《重返德军总部…

Cilium-实战系列-(一)Cilium-安装与部署

前言: 1、首先说一下这篇实战系列和Cilium-ebpf系列文章为 “一文一武”,一个注重点解,一个注重实际操作。 Cilium ebpf 系列文章-什么是ebpf?(一)_clium ebpf-CSDN博客文章浏览阅读419次。一、We Create a containe…

ElasticSearch备考 -- Multi field

一、题目 Create the index hamlet_2 with one primary shard and no replicas Copy the mapping of hamlet_1 into hamlet_2, but also define a multi-field for speaker. The name of such multi-field is tokens and its data type is the (default) analysed string Reind…

[git] github管理项目之环境依赖管理

导出依赖到 requirements.txt pip install pipreqs pipreqs . --encodingutf8 --force但是直接使用pip安装不了torch,需要添加源!! pip install -r requirements.txt -f https://download.pytorch.org/whl/torch_stable.htmlpython 项目中 …

基于VirtualBox和Ubuntu的虚拟环境搭建

VirtualBox简介 VirtualBox 是一款开源虚拟机软件。 是由德国 Innotek 公司开发,由Sun Microsystems公司出品的软件,使用Qt编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。简单易用,可虚拟的系统包括Windows&…

JavaScript-下篇

上篇我们学习了,一些基础语法和函数,现在我们学习下篇,主要包括,对象和事件。而对象又包括,数组Arrays,String字符串,BOM,DOM等 JS对象 Arrays数组 数组是一种特殊的对象,用于存储…

子比主题美化 – 添加天气教程

前言 经常看到很多的网站顶部或者侧边有显示天气状态的小条幅,看着也美观,寻思着也在自己的小站上显示天气。大体的思路是能识别用的ip地址来确认位置然后以代码形式在前台显示出。 经过在百度上搜索一番,发现一个很不错的天气api&#xff…

Java之二叉树的基本操作实现

1. 模拟实现二叉树前,我们要先表示树,首先定义一个内部类,当作二叉树节点 static class TreeNOde{char val;//存放二叉树的值TreeNOde left;//指向左子树的引用TreeNOde right;//指向右子树的引用//构造方法,用于实例化树的节点p…

Luminar财务造假风波:激光雷达龙头的困境与挑战

近日,美国激光雷达上市公司Luminar被爆出财务造假嫌疑,这一消息震惊了整个行业。Luminar,这家曾风光无限的激光雷达公司,最高市值一度达到120亿美元,其年轻的创始人也因此坐拥豪宅豪车无数。然而,如今在市值仅剩5亿美元左右的时候,却被爆出如此丑闻,令人不禁唏嘘。 带…