您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Django中怎么进行数据的增删改
## 前言
Django作为Python生态中最流行的Web框架之一,其ORM(对象关系映射)系统让数据库操作变得异常简单。本文将全面介绍在Django中实现数据增删改查(CRUD)的各种方法,涵盖基础操作、高级技巧以及最佳实践。
---
## 一、环境准备与模型定义
### 1.1 创建Django项目和应用
```bash
django-admin startproject crud_demo
cd crud_demo
python manage.py startapp library
在models.py
中创建示例模型:
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
publish_date = models.DateField()
price = models.DecimalField(max_digits=6, decimal_places=2)
stock = models.PositiveIntegerField(default=0)
def __str__(self):
return self.title
python manage.py makemigrations
python manage.py migrate
from library.models import Book
# 基础创建
Book.objects.create(
title="Python编程:从入门到实践",
author="Eric Matthes",
publish_date="2020-05-01",
price=89.00,
stock=50
)
new_book = Book(
title="流畅的Python",
author="Luciano Ramalho",
publish_date="2017-05-01",
price=128.00,
stock=30
)
new_book.save() # 显式保存
books_data = [
Book(title="Django企业开发实战", author="胡阳", price=99.00),
Book(title="Python数据科学手册", author="Jake VanderPlas", price=118.00)
]
Book.objects.bulk_create(books_data) # 高效批量插入
# views.py
from django.shortcuts import render
from .forms import BookForm
def create_book(request):
if request.method == 'POST':
form = BookForm(request.POST)
if form.is_valid():
form.save()
return redirect('book_list')
else:
form = BookForm()
return render(request, 'create_book.html', {'form': form})
# 获取所有记录
all_books = Book.objects.all()
# 获取单条记录
book = Book.objects.get(pk=1) # 主键查询
python_book = Book.objects.get(title__exact="Python编程") # 精确匹配
# 条件过滤
expensive_books = Book.objects.filter(price__gt=100) # 价格>100
recent_books = Book.objects.filter(publish_date__year__gte=2020) # 2020年后出版
# Q对象复杂查询
from django.db.models import Q
result = Book.objects.filter(
Q(price__lt=50) | Q(stock__gt=100)
)
# 聚合查询
from django.db.models import Avg, Max
Book.objects.aggregate(Avg('price'), Max('stock'))
# 关联查询(假设有外键)
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
# 查询某作者的所有书籍
author_books = Book.objects.filter(author__name="Eric Matthes")
# 方法1:先查询后修改
book = Book.objects.get(pk=1)
book.price = 95.00
book.save() # 更新所有字段
# 方法2:使用update()只更新指定字段
book.save(update_fields=['price']) # 仅更新price字段
# 将所有Python相关书籍涨价10%
Book.objects.filter(title__contains="Python").update(
price=models.F('price') * 1.1
)
# 使用F()避免竞态条件
from django.db.models import F
Book.objects.filter(stock__lt=10).update(stock=F('stock') + 50)
# views.py
def update_book(request, pk):
book = Book.objects.get(pk=pk)
if request.method == 'POST':
form = BookForm(request.POST, instance=book)
if form.is_valid():
form.save()
return redirect('book_detail', pk=book.pk)
else:
form = BookForm(instance=book)
return render(request, 'update_book.html', {'form': form})
# 删除单条记录
book = Book.objects.get(pk=1)
book.delete() # 立即执行删除
# 批量删除
Book.objects.filter(price__lt=20).delete() # 删除所有低价书
# 方法1:使用is_active标记
class SafeDeleteModel(models.Model):
is_active = models.BooleanField(default=True)
def delete(self):
self.is_active = False
self.save()
# 方法2:使用django-safedelete第三方库
from safedelete.models import SafeDeleteModel
class Book(SafeDeleteModel):
_safedelete_policy = SOFT_DELETE # 软删除
# on_delete参数说明
author = models.ForeignKey(
Author,
on_delete=models.CASCADE # 级联删除
# on_delete=models.SET_NULL # 设为NULL
# on_delete=models.PROTECT # 阻止删除
)
from django.db import transaction
@transaction.atomic
def transfer_stock(book1, book2, amount):
book1.stock -= amount
book1.save()
book2.stock += amount
book2.save()
def complex_operation():
with transaction.atomic():
# 操作1
sid = transaction.savepoint()
try:
# 操作2
except Exception:
transaction.savepoint_rollback(sid)
# 减少查询次数
books = Book.objects.select_related('author').all() # 一对一/多对一
books = Book.objects.prefetch_related('categories') # 多对多
# 使用only/defer
Book.objects.only('title', 'price') # 只获取指定字段
Book.objects.defer('description') # 排除大字段
from django.core.paginator import Paginator
paginator = Paginator(Book.objects.all(), 25) # 每页25条
page = paginator.get_page(request.GET.get('page'))
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=Book)
def update_book_cache(sender, instance, **kwargs):
# 更新缓存逻辑
pass
掌握Django的增删改查操作是Web开发的基础。本文涵盖了从基础到高级的各种技巧,在实际开发中应根据具体场景选择合适的方法。建议结合Django官方文档和项目需求,灵活运用这些技术构建健壮的数据库交互层。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。