当前位置: 首页 > wzjs >正文

资源网站源码下载昆明参差网站

资源网站源码下载,昆明参差网站,现在个人做网站或者app还有收益,网站群系统建设思路深入剖析 Django 中的 ORM 语法:从基础到实战进阶 在 Django 开发领域,ORM(对象关系映射)是开发者高效操作数据库的得力工具。它以简洁直观的 Python 代码,替代繁琐的 SQL 语句,极大提升了开发效率。本文将…

深入剖析 Django 中的 ORM 语法:从基础到实战进阶

在 Django 开发领域,ORM(对象关系映射)是开发者高效操作数据库的得力工具。它以简洁直观的 Python 代码,替代繁琐的 SQL 语句,极大提升了开发效率。本文将聚焦 Django 中的 ORM 语法,通过丰富的示例与场景分析,助你全面掌握其核心用法与进阶技巧。

一、Django ORM 基础架构

1.1 模型类定义

Django 通过models.py文件定义模型类,每个模型类对应数据库中的一张表,类属性则对应表中的列。例如,定义一个简单的博客文章模型:

from django.db import modelsclass Article(models.Model):title = models.CharField(max_length=200)content = models.TextField()pub_date = models.DateTimeField(auto_now_add=True)

上述代码中,title使用CharField表示固定长度的字符串字段;content通过TextField存储长文本;pub_date采用DateTimeField记录文章发布时间,auto_now_add=True确保在创建记录时自动填充当前时间。

1.2 字段类型详解

Django 提供了丰富的字段类型,除上述类型外,还有:

  • IntegerField:用于存储整数值,如文章的点赞数。
  • BooleanField:表示布尔值,常用于标记文章是否置顶、是否为精华内容等。
  • ForeignKey:建立表与表之间的一对多关系,例如文章与作者的关联。
  • ManyToManyField:处理多对多关系,如文章与标签之间的关系。

定义外键关系示例:

class Author(models.Model):name = models.CharField(max_length=100)class Article(models.Model):title = models.CharField(max_length=200)content = models.TextField()author = models.ForeignKey(Author, on_delete=models.CASCADE)

on_delete=models.CASCADE表示当关联的作者被删除时,其对应的文章也会被级联删除。

二、Django ORM 常见操作语法

2.1 创建数据

创建数据实例有两种常见方式。第一种是直接实例化模型类并调用save方法:

author = Author(name="张三")
author.save()article = Article(title="Django ORM入门", content="...", author=author)
article.save()

第二种是使用create方法,该方法在创建实例的同时保存到数据库:

article = Article.objects.create(title="Django ORM实战", content="...", author=author)

2.2 查询数据

2.2.1 基础查询

获取所有文章:

all_articles = Article.objects.all()

获取单篇文章(通过主键):

article = Article.objects.get(pk=1)

注意,使用get方法时若记录不存在会抛出DoesNotExist异常,若存在多条符合条件的记录则会抛出MultipleObjectsReturned异常,因此需谨慎使用。

2.2.2 条件查询

Django 支持丰富的查询条件,通过双下划线(__)连接字段和查询条件:

  • 精确匹配:查询标题为 “Django ORM 实战” 的文章
    articles = Article.objects.filter(title="Django ORM实战")
  • 模糊查询:查询标题包含 “Django” 的文章
    articles = Article.objects.filter(title__icontains="Django")

icontains表示不区分大小写的包含查询,还有contains(区分大小写)、startswith(以... 开头)、endswith(以... 结尾)等类似条件。

  • 范围查询:查询发布时间在某一范围内的文章
  • from django.utils import timezone
    articles = Article.objects.filter(pub_date__range=(timezone.now() - timezone.timedelta(days=7), timezone.now()))

2.3 更新数据

先获取实例,修改属性后调用save方法:

article = Article.objects.get(pk=1)
article.title = "更新后的文章标题"
article.save()

也可以使用update方法批量更新:

Article.objects.filter(pub_date__lt=timezone.now() - timezone.timedelta(days=30)).update(is_published=False)

2.4 删除数据

删除单个实例:

article = Article.objects.get(pk=1)
article.delete()

批量删除:

Article.objects.filter(pub_date__lt=timezone.now() - timezone.timedelta(days=365)).delete()

三、Django ORM 进阶应用

3.1 关联关系操作

3.1.1 一对多关系

以上述Author和Article的一对多关系为例,查询某个作者的所有文章:

author = Author.objects.get(pk=1)
articles = author.article_set.all()

反向查询,即通过文章获取作者:

article = Article.objects.get(pk=1)
author = article.author
3.1.2 多对多关系

定义文章与标签的多对多关系:

class Tag(models.Model):name = models.CharField(max_length=50)class Article(models.Model):title = models.CharField(max_length=200)content = models.TextField()tags = models.ManyToManyField(Tag)

为文章添加标签:

article = Article.objects.get(pk=1)
tag1 = Tag.objects.create(name="Django")
tag2 = Tag.objects.create(name="ORM")
article.tags.add(tag1, tag2)

查询包含特定标签的文章:

articles = Article.objects.filter(tags__name="Django")

3.2 聚合与分组查询

聚合查询用于计算总和、平均值、计数等统计信息,需导入django.db.models中的聚合函数:

  • 统计文章总数
from django.db.models import Count
article_count = Article.objects.count()
  • 计算文章平均点赞数(假设 Article 模型有 likes 字段)
from django.db.models import Avg
average_likes = Article.objects.aggregate(Avg('likes'))

分组查询结合annotate方法使用,例如统计每个作者的文章数量:

from django.db.models import Count
authors_with_article_count = Author.objects.annotate(article_count=Count('article'))
for author in authors_with_article_count:print(f"{author.name} 发表了 {author.article_count} 篇文章")

3.3 事务处理

Django 通过transaction.atomic装饰器或上下文管理器确保数据库操作的原子性。例如,同时更新文章和作者信息:

from django.db import transaction@transaction.atomic
def update_article_and_author():with transaction.atomic():article = Article.objects.get(pk=1)article.title = "更新后的文章标题"article.save()author = article.authorauthor.name = "更新后的作者名"author.save()

若在事务块内发生异常,所有操作将回滚,保证数据一致性。

四、Django ORM 性能优化策略

4.1 避免 N+1 问题

N+1 问题常出现在处理关联关系查询时。例如,获取所有作者及其文章,若不优化会执行 1 次查询获取作者列表,再为每个作者执行 1 次查询获取其文章,导致大量数据库查询。

使用select_related优化一对多关系查询:

authors = Author.objects.select_related('article').all()

prefetch_related用于优化多对多或反向一对多关系:

articles = Article.objects.prefetch_related('tags').all()

4.2 索引优化

根据常用查询条件,在模型字段上添加索引可显著提升查询性能。例如,为文章标题字段添加索引:

class Article(models.Model):title = models.CharField(max_length=200, db_index=True)content = models.TextField()pub_date = models.DateTimeField(auto_now_add=True)

通过db_index=True即可为该字段创建索引,但需注意索引并非越多越好,过多索引会影响数据插入和更新性能。

五、总结

Django 的 ORM 语法功能强大且灵活,从基础的数据增删改查,到复杂的关联关系处理、聚合分组查询,再到性能优化,都为开发者提供了高效便捷的解决方案。在实际项目中,熟练掌握这些语法和技巧,能帮助我们构建出性能优良、易于维护的数据库驱动应用。随着对 Django ORM 理解的深入,不断在实践中探索,你将在 Web 开发领域更游刃有余。如果你在使用过程中有新的发现或遇到问题,欢迎在评论区交流分享!


文章转载自:

http://gaT2Fg3k.dyyhw.cn
http://gDemO0jb.dyyhw.cn
http://0nZYG77B.dyyhw.cn
http://x6nfKplp.dyyhw.cn
http://fIqj2bwj.dyyhw.cn
http://yR8dOwAK.dyyhw.cn
http://SmiR53rV.dyyhw.cn
http://099XJqjs.dyyhw.cn
http://FFbx8uM4.dyyhw.cn
http://fMY0I9im.dyyhw.cn
http://VcmxYbWF.dyyhw.cn
http://OVlrK2xG.dyyhw.cn
http://Kty4qdxE.dyyhw.cn
http://cSLB8uad.dyyhw.cn
http://iyVmlbJu.dyyhw.cn
http://jIqTkfBZ.dyyhw.cn
http://zEfXqnBB.dyyhw.cn
http://kw9hhJZC.dyyhw.cn
http://HOBtPhy6.dyyhw.cn
http://qVkaP1Fp.dyyhw.cn
http://3KTph5oC.dyyhw.cn
http://Zkj1YHDQ.dyyhw.cn
http://09O0R0Lv.dyyhw.cn
http://cYUsM7vw.dyyhw.cn
http://aFCABJ5i.dyyhw.cn
http://pqTju4J2.dyyhw.cn
http://ciwVKpXT.dyyhw.cn
http://NjgKkfJf.dyyhw.cn
http://3XYGEewA.dyyhw.cn
http://VcAvctN7.dyyhw.cn
http://www.dtcms.com/wzjs/721066.html

相关文章:

  • 网站的信息管理建设的必要性网站建设调研文档
  • 子网站域名ip地址查询百度搜索引擎怎么弄
  • 网站地图模板class wp wordpress
  • 网站建设目的分析wordpress随机播放器
  • 网站的footer怎么做wordpress网络公司主题
  • 大岭山镇网站建设公司网页界面设计的用途有
  • 福州网站建设 联系yanktcn 04投投app最新投票平台
  • 自学建设网站网站建设要注意哪些
  • 网站建设中搜索引擎的作用宁波seo关键词培训
  • 网站开发设计选题背景wordpress视频缩略图插件
  • 郑州制作网站电话133搭建网站的流程和方法
  • 外贸自建站如何收款公司网站简介怎么做
  • 做网站引流合肥网站建设制作价格
  • 网站网页建设与制作怎么做账注册中文域名一年多少钱
  • 潍坊优化网站页面设计免费
  • 五大免费资源网站网站做好后
  • 一键建站上海韵茵网站建设
  • 网页设计与网站建设有区别吗深圳建设方面上市公司有
  • 捕鱼游戏网站制作模板原网站备案在哪
  • 字体多的网站浙江二建建设集团有限公司网站
  • 网站首页图片不清楚wordpress搬家后空白
  • 公司注册网上申请网站wordpress增加产品模块
  • 网站模块设计网站什么时候做解析
  • 展馆设计网站推荐广告传媒公司业务
  • 建设一个网站用什么软件广州百度网站建设公司
  • 医疗图片做网站图片郫县建设局网站
  • 徐州网站排名系统建设银行手机银行登录网站
  • 杭州建设网站怎么做网站vip并且收费
  • 西安网站建设招标中国加盟网首页
  • 网站开发的基本技术路线美食介绍网站模板