django中实现数据库操作

在Django中,数据库操作通常通过Django的ORM(Object-Relational Mapping)来实现。ORM允许你使用Python类来表示数据库表,并可以使用Python语法来查询和操作数据库。

以下是在Django中实现数据库操作的基本步骤:

一:定义模型

首先,你需要在Django应用中定义模型。模型是数据库表的抽象表示,通常定义在models.py文件中。例如,假设我们有一个名为Person的模型,可以像这样定义:

from django.db import models

class Person(models.Model):

name = models.CharField(max_length=100)

age = models.IntegerField()

二:运行迁移(Migrations)

在定义了模型后,需要运行迁移以在数据库中创建相应的表。可以通过以下命令来创建和应用迁移:

python manage.py makemigrations

python manage.py migrate

三:查询数据库

Django的ORM提供了许多方法来查询数据库。以下是一些基本示例:

获取所有记录:

persons = Person.objects.all()

获取特定记录:

person = Person.objects.get(name="John Doe")

过滤记录:

persons = Person.objects.filter(age__gt=30)

要插入新记录,可以创建模型的实例并调用save()方法。例如:

new_person = Person(name="Jane Doe", age=25)

new_person.save()

要更新记录,可以获取该记录的实例,修改其属性,然后再次调用save()方法。例如:

person = Person.objects.get(name="Jane Doe")

person.age = 30

person.save()

要删除记录,可以调用delete()方法。例如:

person = Person.objects.get(name="Jane Doe")

person.delete()

这些只是Django ORM的一些基本功能。Django还提供了许多高级功能,如复杂查询、聚合、事务管理等。

事物操作例子:

以下是一个使用Django ORM进行数据库事务的简单例子:

首先,假设我们有两个模型:BankAccount 和 Transaction。

from django.db import models

class BankAccount(models.Model):

account_name = models.CharField(max_length=100)

balance = models.DecimalField(max_digits=10, decimal_places=2)

class Transaction(models.Model):

from_account = models.ForeignKey(BankAccount, on_delete=models.CASCADE, related_name='transactions_from')

to_account = models.ForeignKey(BankAccount, on_delete=models.CASCADE, related_name='transactions_to')

amount = models.DecimalField(max_digits=10, decimal_places=2)

现在,我们想要执行一个转账操作,即从一个账户扣款并给另一个账户存款。这个操作需要确保原子性,即如果扣款成功但存款失败,那么扣款操作也应该被撤销。

from django.db import transaction

from .models import BankAccount, Transaction

def transfer_money(from_account_name, to_account_name, amount):

try:

开始一个新的事务

with transaction.atomic():

获取账户实例

from_account = BankAccount.objects.get(account_name=from_account_name)

to_account = BankAccount.objects.get(account_name=to_account_name)

检查转账金额是否有效

if from_account.balance < amount:

raise ValueError("Insufficient balance")

创建转账记录

transaction = Transaction(

from_account=from_account,

to_account=to_account,

amount=amount

)

transaction.save()

更新账户余额

from_account.balance -= amount

from_account.save()

to_account.balance += amount

to_account.save()

如果一切顺利,事务将在此处提交

except ValueError as e:

如果发生错误,事务将在此处回滚

print(f"Transaction failed: {e}")

except Exception as e:

其他任何异常也会导致事务回滚

print(f"An error occurred: {e}")

使用示例

transfer_money("Alice", "Bob", 100)

在上面的代码中,transfer_money 函数使用 transaction.atomic() 上下文管理器来确保转账操作在事务中执行。如果在转账过程中遇到任何错误(例如,账户余额不足或数据库保存失败),那么事务将自动回滚,所有更改都不会保存到数据库中。

为了更深入地了解Django的数据库操作,建议查阅Django官方文档。

相关推荐
Java知识技术分享32 分钟前
使用LangChain构建第一个ReAct Agent
python·react.js·ai·语言模型·langchain
奔跑吧邓邓子43 分钟前
【Python爬虫(44)】分布式爬虫:筑牢安全防线,守护数据之旅
开发语言·分布式·爬虫·python·安全
程序员 小濠1 小时前
接口测试基础 --- 什么是接口测试及其测试流程?
自动化测试·python·测试工具·职场和发展·appium·接口测试·压力测试
程序媛徐师姐1 小时前
Python基于Django的酒店推荐系统【附源码】
python·django·酒店·酒店推荐·python django·酒店推荐系统·python酒店推荐系统
~kiss~2 小时前
python的thrift2pyi学习
windows·python·学习
奔跑吧邓邓子2 小时前
【Python爬虫(45)】Python爬虫新境界:分布式与大数据框架的融合之旅
开发语言·分布式·爬虫·python·大数据框架
Luke Ewin2 小时前
根据音频中的不同讲述人声音进行分离音频 | 基于ai的说话人声音分离项目
人工智能·python·音视频·语音识别·声纹识别·asr·3d-speaker
大米洗澡2 小时前
数字签名技术基础
python·学习·程序人生·面试·职场和发展
神一样的老师3 小时前
ChromeDriver版本不匹配问题的解决
python
起个破名想半天了3 小时前
Web自动化中Selenium下Chrome与Edge的Webdriver常用Options参数
python·selenium·自动化