
1. Django单表操作基础概念在Django框架中单表操作是最基础也是最重要的数据库交互方式。所谓单表操作指的是针对单个模型Model进行的增删改查CRUD操作不涉及多表关联查询。这是每个Django开发者必须熟练掌握的核心技能。Django的ORM对象关系映射系统将数据库表映射为Python类表中的字段映射为类的属性。这种设计让我们可以用面向对象的方式操作数据库而无需直接编写SQL语句。例如一个简单的博客文章模型可能长这样from django.db import models class Article(models.Model): title models.CharField(max_length200) content models.TextField() pub_date models.DateTimeField(auto_now_addTrue) is_published models.BooleanField(defaultFalse)这个Article类对应数据库中的一张表每个字段类型对应特定的数据库列类型。Django的ORM会自动处理Python对象与数据库记录之间的转换。提示虽然Django ORM功能强大但理解背后的SQL执行原理对性能优化很有帮助。可以使用print(queryset.query)查看生成的SQL语句。2. 单表数据创建操作2.1 创建记录的三种方式在Django中向单表插入数据主要有三种方法第一种是使用模型的create()方法这是最简洁的方式Article.objects.create( titleDjango单表操作指南, content详细讲解Django单表CRUD操作..., is_publishedTrue )第二种是先创建模型实例再调用save()方法new_article Article( titlePython Web开发, content使用Django构建Web应用..., is_publishedFalse ) new_article.save() # 此时才会真正写入数据库第三种是使用get_or_create()方法这在需要避免重复创建时特别有用obj, created Article.objects.get_or_create( title避免重复的标题, defaults{content: 当标题不存在时创建新记录} )2.2 批量创建记录当需要插入大量数据时使用bulk_create()可以显著提高性能articles [ Article(titlef文章{i}, contentf内容{i}) for i in range(100) ] Article.objects.bulk_create(articles) # 一次SQL插入多条记录注意bulk_create()不会触发模型的save()方法和pre_save/post_save信号且不会返回带有主键的对象除非数据库支持。3. 单表数据查询操作3.1 基础查询方法Django提供了丰富的查询API最基本的是all()和get()# 获取所有文章 all_articles Article.objects.all() # 获取单个对象必须存在且唯一 article Article.objects.get(id1)filter()和exclude()用于条件查询# 获取已发布的文章 published_articles Article.objects.filter(is_publishedTrue) # 获取未发布的文章 unpublished_articles Article.objects.exclude(is_publishedTrue)3.2 高级查询技巧Django的查询API支持链式调用和复杂条件from django.db.models import Q # 多条件查询 recent_published Article.objects.filter( is_publishedTrue, pub_date__year2023 ) # 使用Q对象实现OR条件 important_articles Article.objects.filter( Q(title__contains重要) | Q(content__contains紧急) ) # 字段查找类型 starts_with Article.objects.filter(title__startswithDjango) contains Article.objects.filter(content__icontainsweb) # 不区分大小写3.3 查询结果处理查询返回的是QuerySet对象支持多种处理方式# 切片和索引 first_article Article.objects.all()[0] last_five Article.objects.all()[:5] # 聚合和统计 from django.db.models import Count, Avg stats Article.objects.aggregate( totalCount(id), publishedCount(id, filterQ(is_publishedTrue)) ) # 排序 ordered Article.objects.order_by(-pub_date, title)4. 单表数据更新操作4.1 单个对象更新更新单个记录通常有两种方式# 方式1先获取再修改保存 article Article.objects.get(id1) article.title 修改后的标题 article.save() # 方式2直接更新 Article.objects.filter(id1).update(title直接更新标题)提示save()会更新所有字段而update()只更新指定字段且更高效。4.2 批量更新使用update()可以高效地批量修改记录# 将所有未发布文章标记为已发布 Article.objects.filter(is_publishedFalse).update(is_publishedTrue) # 使用F表达式基于字段当前值更新 from django.db.models import F Article.objects.all().update(view_countF(view_count) 1)4.3 条件更新结合复杂查询条件实现精准更新# 只更新特定条件的记录 Article.objects.filter( pub_date__year2022, title__contains旧 ).update(is_publishedFalse)5. 单表数据删除操作5.1 删除单个对象删除记录也有两种主要方式# 方式1先获取再删除 article Article.objects.get(id1) article.delete() # 方式2直接删除 Article.objects.filter(id1).delete()5.2 批量删除使用查询条件批量删除记录# 删除所有未发布的旧文章 Article.objects.filter( is_publishedFalse, pub_date__ltdatetime(2020,1,1) ).delete()5.3 删除所有记录谨慎使用全表删除# 删除所有文章不可逆操作 Article.objects.all().delete()重要警告删除操作是不可逆的生产环境中执行前务必确认备份和数据重要性。6. 单表操作高级技巧6.1 使用values()和values_list()当只需要部分字段时这两个方法可以减少内存使用# 返回字典列表 titles Article.objects.values(id, title) # 返回元组列表 title_tuples Article.objects.values_list(id, title) # 扁平化单字段查询 title_list Article.objects.values_list(title, flatTrue)6.2 延迟加载和仅加载优化查询性能的两种方式# defer()延迟加载大字段 articles Article.objects.defer(content) # only()仅加载指定字段 minimal Article.objects.only(id, title)6.3 原生SQL查询当ORM功能不足时可以使用原生SQLfrom django.db import connection with connection.cursor() as cursor: cursor.execute(SELECT title FROM blog_article WHERE id %s, [1]) row cursor.fetchone()7. 实战经验与常见问题7.1 N1查询问题这是Django开发中最常见的性能陷阱# 错误示例会导致N1查询 for article in Article.objects.all(): print(article.author.name) # 每次循环都查询一次author # 正确做法使用select_related或prefetch_related articles Article.objects.select_related(author).all()7.2 事务处理确保数据一致性的关键from django.db import transaction transaction.atomic def update_article(): article Article.objects.select_for_update().get(id1) article.view_count 1 article.save()7.3 信号使用在数据操作前后执行自定义逻辑from django.db.models.signals import pre_save, post_delete from django.dispatch import receiver receiver(pre_save, senderArticle) def update_slug(sender, instance, **kwargs): if not instance.slug: instance.slug slugify(instance.title)在实际项目中我发现很多开发者会过度使用ORM的高级功能而忽视了基础的单表操作优化。一个常见的误区是在不需要的时候使用select_related和prefetch_related这反而会降低性能。正确的做法是根据实际查询需求和数据量来选择最合适的操作方法。