django中怎么进行数据的增删改

发布时间:2021-10-21 15:10:39 作者:柒染
来源:亿速云 阅读:159
# Django中怎么进行数据的增删改

## 前言

Django作为Python生态中最流行的Web框架之一,其ORM(对象关系映射)系统让数据库操作变得异常简单。本文将全面介绍在Django中实现数据增删改查(CRUD)的各种方法,涵盖基础操作、高级技巧以及最佳实践。

---

## 一、环境准备与模型定义

### 1.1 创建Django项目和应用
```bash
django-admin startproject crud_demo
cd crud_demo
python manage.py startapp library

1.2 定义数据模型

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

1.3 迁移数据库

python manage.py makemigrations
python manage.py migrate

二、数据创建(Create)

2.1 使用create()方法

from library.models import Book

# 基础创建
Book.objects.create(
    title="Python编程:从入门到实践",
    author="Eric Matthes",
    publish_date="2020-05-01",
    price=89.00,
    stock=50
)

2.2 使用save()方法

new_book = Book(
    title="流畅的Python",
    author="Luciano Ramalho",
    publish_date="2017-05-01",
    price=128.00,
    stock=30
)
new_book.save()  # 显式保存

2.3 批量创建

books_data = [
    Book(title="Django企业开发实战", author="胡阳", price=99.00),
    Book(title="Python数据科学手册", author="Jake VanderPlas", price=118.00)
]
Book.objects.bulk_create(books_data)  # 高效批量插入

2.4 表单数据创建

# 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})

三、数据查询(Read)

3.1 基础查询方法

# 获取所有记录
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年后出版

3.2 高级查询技巧

# 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")

四、数据更新(Update)

4.1 单条记录更新

# 方法1:先查询后修改
book = Book.objects.get(pk=1)
book.price = 95.00
book.save()  # 更新所有字段

# 方法2:使用update()只更新指定字段
book.save(update_fields=['price'])  # 仅更新price字段

4.2 批量更新

# 将所有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)

4.3 表单更新示例

# 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})

五、数据删除(Delete)

5.1 基础删除操作

# 删除单条记录
book = Book.objects.get(pk=1)
book.delete()  # 立即执行删除

# 批量删除
Book.objects.filter(price__lt=20).delete()  # 删除所有低价书

5.2 安全删除策略

# 方法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  # 软删除

5.3 删除关联数据

# on_delete参数说明
author = models.ForeignKey(
    Author,
    on_delete=models.CASCADE  # 级联删除
    # on_delete=models.SET_NULL  # 设为NULL
    # on_delete=models.PROTECT  # 阻止删除
)

六、事务处理

6.1 基础事务

from django.db import transaction

@transaction.atomic
def transfer_stock(book1, book2, amount):
    book1.stock -= amount
    book1.save()
    book2.stock += amount
    book2.save()

6.2 保存点

def complex_operation():
    with transaction.atomic():
        # 操作1
        sid = transaction.savepoint()
        
        try:
            # 操作2
        except Exception:
            transaction.savepoint_rollback(sid)

七、性能优化

7.1 select_related和prefetch_related

# 减少查询次数
books = Book.objects.select_related('author').all()  # 一对一/多对一
books = Book.objects.prefetch_related('categories')  # 多对多

7.2 仅获取必要字段

# 使用only/defer
Book.objects.only('title', 'price')  # 只获取指定字段
Book.objects.defer('description')  # 排除大字段

7.3 分页查询

from django.core.paginator import Paginator

paginator = Paginator(Book.objects.all(), 25)  # 每页25条
page = paginator.get_page(request.GET.get('page'))

八、最佳实践

  1. 始终使用参数化查询防止SQL注入
  2. 批量操作代替循环单次操作
  3. 合理使用索引提高查询效率
  4. 定期清理无用数据
  5. 记录操作日志用于审计
  6. 考虑使用信号(signals)处理复杂逻辑
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官方文档和项目需求,灵活运用这些技术构建健壮的数据库交互层。 “`

推荐阅读:
  1. 4、django操作单表进行增删改
  2. Django里对数据库基本增删改查操作

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

django

上一篇:隧道代理是怎么进行工作的

下一篇:css中有什么命名规范

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》