Django ORM 进行基础 CRUD 操作(创建、读取、更新、删除)

news2024/11/26 1:53:59

Django ORM 进行基础 CRUD 操作(创建、读取、更新、删除)

Django 是一个流行的 Python web 框架,提供了很多实用的功能来帮助开发者快速构建 web 应用程序。Django 的 ORM(Object-Relational Mapping)是其强大的数据库工具之一。ORM 的作用是将数据库中的表和 Python 对象进行映射,使得开发者可以通过 Python 代码操作数据库,而不需要手动编写 SQL 语句。

在这里插入图片描述

本文将详细介绍如何使用 Django ORM 进行最基本的数据库操作,也就是常说的 CRUD 操作:创建(Create)、读取(Read)、更新(Update)和删除(Delete)。

一、准备工作:设置 Django 项目和模型

在开始之前,你需要有一个 Django 项目以及一个定义好的模型。我们假设已经有了一个名为 myapp 的应用,并且我们要操作一个用户模型 User。该模型包含用户名、电子邮件和年龄字段。我们将在这个模型的基础上进行 CRUD 操作。

1. 安装并创建 Django 项目

首先,如果你还没有安装 Django,可以使用 pip 来安装它:

pip install django

安装完成后,使用以下命令创建一个新的 Django 项目和应用:

django-admin startproject myproject
cd myproject
python manage.py startapp myapp

在应用 myapp 中创建一个简单的模型 User。修改 myapp/models.py 文件,添加如下内容:

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
    age = models.IntegerField()

    def __str__(self):
        return self.name

这个模型 User 有三个字段:name(用户的名字)、email(电子邮件)和 age(年龄)。定义模型后,别忘了将 myapp 添加到项目的 settings.py 中:

INSTALLED_APPS = [
    # 其他已安装的应用
    'myapp',
]

2. 进行数据库迁移

在 Django 中,每次修改模型时,都需要生成迁移文件并应用迁移。使用以下命令生成迁移文件并将模型应用到数据库:

python manage.py makemigrations
python manage.py migrate

现在,我们的数据库中已经有了 User 表,并且可以开始进行 CRUD 操作了。

二、创建(Create)操作

1. 创建对象并保存到数据库

在 Django ORM 中,创建数据非常简单。我们可以直接创建模型对象并调用 .save() 方法将其保存到数据库。例如,我们可以在 Django shell 中创建一个新用户:

首先,启动 Django shell:

python manage.py shell

在 shell 中,执行以下代码:

from myapp.models import User

# 创建一个新的用户对象
user = User(name='Alice', email='alice@example.com', age=25)

# 保存到数据库
user.save()

print(user.id)  # 输出新创建用户的 ID

通过这段代码,我们创建了一个新的 User 对象,并通过 save() 方法将其保存到了数据库中。user.id 会返回新创建的用户在数据库中的主键 ID。

2. 使用 create() 方法

Django 提供了一种更简洁的方法来创建和保存对象:create()create() 方法可以一步到位地完成创建和保存对象的操作。你可以像这样使用它:

User.objects.create(name='Bob', email='bob@example.com', age=30)

这将直接在数据库中创建一个新用户,并且无需手动调用 save() 方法。

三、读取(Read)操作

读取操作是从数据库中获取数据。在 Django ORM 中,你可以通过查询集(QuerySet)来获取模型实例。Django 的查询集非常强大,允许你进行多种过滤和排序操作。

1. 获取所有对象

使用 all() 方法可以获取所有 User 对象:

users = User.objects.all()
for user in users:
    print(user.name, user.email, user.age)

all() 方法返回一个包含所有 User 对象的查询集。你可以遍历这个查询集来访问每个对象的属性。

2. 根据条件过滤对象

你可以使用 filter() 方法来根据特定条件查询对象。假设我们想要获取所有年龄大于 25 的用户,可以这样做:

users = User.objects.filter(age__gt=25)  # age__gt 表示大于 25
for user in users:
    print(user.name, user.age)

Django 提供了丰富的查询条件操作符,如 lt(小于)、gte(大于等于)、exact(精确匹配)等。

3. 获取单个对象

如果你只想获取单个对象,可以使用 get() 方法。get() 需要确保查询结果只有一条记录,否则会抛出异常。例如,按邮箱地址查询用户:

user = User.objects.get(email='alice@example.com')
print(user.name, user.age)

注意,如果没有匹配的记录,get() 会抛出 User.DoesNotExist 异常;如果有多条记录满足条件,get() 会抛出 MultipleObjectsReturned 异常。

4. 使用 values()values_list()

有时候你只想获取对象的某些字段,而不是整个对象。可以使用 values()values_list() 来只获取指定的字段:

# 获取所有用户的名字和年龄
users = User.objects.values('name', 'age')
for user in users:
    print(user['name'], user['age'])

# 获取所有用户的名字(返回一个列表)
user_names = User.objects.values_list('name', flat=True)
print(user_names)

values() 返回的是字典,而 values_list() 返回的是元组。如果 flat=True,则 values_list() 返回单个字段的值的列表。

四、更新(Update)操作

1. 更新单个对象

要更新对象的某些字段,可以简单地修改对象属性并调用 save() 方法。比如我们想要修改某个用户的年龄:

user = User.objects.get(email='alice@example.com')
user.age = 26
user.save()

这段代码会更新 user 对象的年龄并将更改保存到数据库。

2. 使用 update() 方法

如果你想要批量更新多个对象,可以使用 update() 方法。update() 会直接在数据库中执行更新操作,而无需先获取对象。假设我们想将所有年龄大于 30 的用户的年龄增加 1 岁:

User.objects.filter(age__gt=30).update(age=models.F('age') + 1)

这里的 F() 对象表示数据库中的字段值,models.F('age') + 1 表示在原有的基础上加 1。

五、删除(Delete)操作

1. 删除单个对象

删除对象的方法非常简单。获取到对象后,调用 .delete() 方法即可:

user = User.objects.get(email='alice@example.com')
user.delete()

这将从数据库中删除对应的记录。

2. 批量删除对象

你也可以使用查询集来批量删除多个对象。例如,我们想要删除所有年龄大于 40 的用户:

User.objects.filter(age__gt=40).delete()

这会删除所有符合条件的用户。注意,delete() 不会调用模型的 save() 方法,因此不会触发 save() 中定义的任何逻辑。

六、总结

Django ORM 提供了强大的工具,帮助开发者用简单、优雅的 Python 代码与数据库进行交互,而无需直接编写 SQL 语句。通过 CRUD 操作,你可以轻松地创建、读取、更新和删除数据库中的数据。

1. 创建(Create)

  • 使用 save() 方法或 create() 方法创建并保存对象到数据库。

2. 读取(Read)

  • 使用 all() 方法获取所有记录。
  • 使用 filter() 进行条件查询。
  • 使用 get() 获取单个对象。
  • 使用 values()values_list() 仅获取指定字段。

3. 更新(Update)

  • 修改对象的属性并调用 save() 方法保存更改。
  • 使用 update() 方法批量更新对象。

4. 删除(Delete)

  • 使用 .delete() 方法删除单个对象或批量删除多个对象。

通过这些简单的操作,Django ORM 可以大大简化与数据库的交互过程,使得 web 开发更加高效和直观。无论你是初学者还是有经验的开发者,掌握这些 CRUD 操作是使用 Django ORM 的基础技能。

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

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

相关文章

Java_ EE (网络编程)

网络编程基本概念: 计算机网络计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。从其…

【C++算法】双指针

目录 一、快乐数: 二、有效三角形的个数: 三、盛最多水的容器: 四、复写0: 五、三数之和: 总结: 一、快乐数: 题目出处: 202. 快乐数 - 力扣(LeetCode&#xff09…

spring task的使用场景

spring task 简介 spring task 是spring自带的任务调度框架按照约定的时间执行某个方法的工具,类似于闹钟 应用场景 cron表达式 周和日两者必定有一个是问号 简单案例

基于java的企业车辆管理系统设计与实现(论文+源码)-kaic

摘 要 随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同时就产生了车辆资源的合理分配使用问题。现有的车辆管理系统存在着不足之处,例如系统不够稳定,功能不够全面。因此&#xff0c…

Python基础之转义字符

字符串转义 转义是指在字符前加一个 \ \ n 则表示原来的字符n不代表字符n 赋予了一个新的含义 变成了一个换行符 print(wu\nzj\njing) \n 会解释为一个换行符 s "wu\"zj" 双引号是用来创建一个字符串的效果 加上\后就变成了一个字符双引号 它就是一个…

如何解决 Open /etc/postfix/main.cf: Permission denied ?

最近我的 Postfix 邮件系统无法发送电子邮件,报错内容:Open /etc/postfix/main.cf: Permission denied 经过一番调查,我能够解决这个问题。 日志文件中发现的错误如下: Jun 27 12:51:02 tecadmin postfix/postfix-script[11764]…

AI大模型开发架构设计(11)——AI 大模型与提示词工程助力职场典型案例场景实战

文章目录 AI 大模型与提示词工程助力职场典型案例场景实战1 AI大模型全局架构实战剖析AI大模型常见术语AI 大模型全局架构 2 Prompt Engineering 整体应用场景剖析Prompt 提示词的三个层次Prompt 提示词的经典模板如何让 Prompt 提示词做的更好?如何让 Prompt 提示词自动优化改…

ResNet模型

使用pytoch实现 1.卷积神经网络 conv2d的参数很简单 conv2d(input_channels, output_channels,kernel_size, stride, padding) 参数分别是输入通道,输出通道,卷积核大小,移动步长,填充数量。 输入通道是特征图的深度&#xff0c…

Android上的AES加密

基础算法说明 https://www.youtube.com/watch?vlnKPoWZnNNM 虽然这个视频讲的非常详细,但是涉及到具体底层算法,大致流程 1. 将数据转成HEX或者byte array 2.将数据分层一块块等大小的数据 3.将数据和key 进行一次混合,加密之后的输出&…

(vue)el-tabs标签页展示el-table动态表头表格

&#xff08;vue&#xff09;el-tabs标签页展示el-table动态表头表格 效果: 代码 <el-tabs v-if"showStatistics" type"border-card"><el-tab-panev-for"(item, index) in statisticsTable":key"index":label"item.pr…

C++游戏开发指南(新改)

目录 1. 引言 2. C的基础知识 2.1 面向对象编程与游戏开发 2.2 指针与内存管理 2.3 C和其他游戏开发语言的比较 3. 游戏引擎的选择 3.1 Unreal Engine 3.2 Unity 3.3 游戏引擎对比表 4. 游戏架构设计 4.1 ECS架构 4.2 游戏循环 5. C中的图形编程基础 5.1 DirectX…

Panasonic Programming Contest 2024(AtCoder Beginner Contest 375)题解

A - Seats 思路&#xff1a;从前往后扫&#xff0c;判断有多少个.的左右各有一个# #include<bits/stdc.h> using namespace std; #define int long longint n; string s;signed main() {cin>>n;cin>>s;int cnt0;if(s.size()<3){cout<<0<<&quo…

python中双引号和单引号的区别是什么

python3中的单引号‘’和双引号“”的作用一样。 3个单引号的作用&#xff1a; 1、表示注释 #3个单引号表示注释多行gf_of_archerzon "Wang" print("archerzon的女盆友是",gf_of_archerzon) print("archerzon的女盆友是%s"%gf_of_archerzon)2…

PolarCTF靶场[web]file、ezphp WP

[WEB]file 知识点&#xff1a;文件上传漏洞 工具&#xff1a;Burp Suite、dirsearch 方法一&#xff1a; 根据页面提示&#xff0c;先用dirsearch工具扫一扫 访问/upload.php&#xff0c;发现一个上传区 在访问/uploaded/,再点击Parent Directory&#xff0c;发现链接到首页…

NVIDIA GPGPU的通信架构解析

NVIDIA GPGPU- 通信架构 写在前面 在本部分&#xff0c;我们将深入探讨NVLink、NCCL、NVSwitch和GPGPU之间的紧密联系。重点关注通信系统及其与计算的耦合性&#xff0c;以揭示Nvlink & NVSwitch System在支持NVIDIA GPGPU大规模计算和超大算力方面的重要作用。为了更好地…

新生入门季 | 学习生物信息分析,如何解决个人电脑算力不足的问题?

随着生物信息学在科研和教育中的快速普及&#xff0c;越来越多的新生开始接触基因组测序、RNA分析等复杂计算任务。然而&#xff0c;在面对这些大规模数据时&#xff0c;个人电脑的算力往往显得捉襟见肘。你是否也在为自己的笔记本性能不足而苦恼&#xff1f; 这篇文章将为你提…

【读书笔记-《30天自制操作系统》-27】Day28

本篇的内容不少&#xff0c;主要围绕着文件操作与文字显示展开。 1. alloca函数 在开发文件操作与文字显示之前&#xff0c;需要先做一些准备&#xff0c;引入alloca函数。首先看下面的代码&#xff1a; #include <stdio.h> #include "apilib.h"#define MA…

美畅物联丨剖析 GB/T 28181 与 GB 35114:视频汇聚领域的关键协议

我们在使用畅联云平台进行视频汇聚时&#xff0c;经常会用的GB/T 28181协议&#xff0c;前面我们写了关于GB/T 28181的相关介绍&#xff0c;​ 详见《畅联云平台&#xff5c;关于GB28181你了解多少&#xff1f;》。 ​最近也有朋友向我们咨询GB 35114协议与GB/T 28181有什么不同…

基于STM32的智能运输机器人设计

引言 本项目设计了一个基于STM32的智能运输机器人&#xff0c;能够自动识别路径、避开障碍物&#xff0c;并根据用户的指令将物品运输到指定地点。该机器人集成了超声波传感器、红外传感器、无线通信模块等&#xff0c;通过STM32对电机的控制&#xff0c;实现平稳、智能的运输…

【深度学习】RNN的简单实现

目录 1.RNNCell 2.RNN 3.RNN_Embedding 1.RNNCell import torchinput_size 4 hidden_size 4 batch_size 1idx2char [e, h, l, o] x_data [1, 0, 2, 2, 3] # 输入&#xff1a;hello y_data [3, 1, 2, 3, 2] # 期待&#xff1a;ohlol# 独热向量 one_hot_lookup [[1, …