Django ORM高级应用方法详解

yizhihongxing

自定义查询方法

Django ORM提供了很多内置的查询方法,但是有时候我们需要自定义一些特殊的查询方法。这时可以使用queryset.annotate()queryset.filter()方法来实现自定义查询。

from django.db.models import Count, Q

# 自定义查询方法
def get_custom_queryset(self):
    queryset = self.annotate(
        num_comments=Count('comments', distinct=True),
        num_likes=Count('likes', distinct=True),
    ).filter(
        Q(num_comments__gte=10) | Q(num_likes__gte=10)
    )
    return queryset

数据库分组查询

Django ORM支持使用annotate()方法实现分组查询,并且支持使用aggregation函数进行统计。

from django.db.models import Count

# 查询每个tag下有多少篇文章
queryset = Article.objects.annotate(num_articles=Count('tags')).values('tags__name', 'num_articles')

跨表关联查询

Django ORM支持通过外键和多对多关系进行跨表查询,可以使用related_namerelated_query_name来指定关联名称和查询名称。

from django.db.models import Q

# 查询所有用户发布的文章
queryset = Article.objects.filter(user__username='admin')

# 查询所有评论过的文章
queryset = Article.objects.filter(comments__user__username='admin')

# 查询所有被喜欢过的文章
queryset = Article.objects.filter(likes__user__username='admin')

# 查询所有tag为'Python'的文章
queryset = Article.objects.filter(tags__name='Python')

# 查询当前用户关注的用户发布的文章
queryset = Article.objects.filter(
    user__in=User.objects.filter(followers__follower=request.user)
)

使用子查询查询

Django ORM支持使用子查询查询,并且可以使用SubqueryOuterRef来引用外层的查询。

from django.db.models import OuterRef, Subquery

# 查询每个用户评论数量排名前三的文章
top3_query = Comment.objects.filter(
    article=OuterRef('pk')
).order_by('-id')[:3].values('id')
queryset = Article.objects.annotate(
    num_comments=Count('comments', distinct=True)
).annotate(
    top3_comments=Subquery(top3_query)
).order_by('-num_comments')

使用MySQL专有方法

虽然Django ORM是支持多种数据库的,但是不同的数据库具有不同的特性和功能。如果要使用MySQL专有的方法,可以通过Func函数来实现。

from django.db.models import F, Func

# 查询每个用户发布的文章数量
queryset = Article.objects.annotate(
    num_articles=Func(
        F('user_id'),
        function='COUNT',
        distinct=True,
        output_field=models.IntegerField(),
    )
)

使用F()函数更新数据

Django ORM支持使用F()函数来实现对数据库的原子更新操作。这样可以避免并发更新数据出现的问题。

from django.db.models import F

# 对数据进行原子更新,使点赞数加1
Article.objects.filter(id=1).update(likes=F('likes')+1)

批量插入数据

Django ORM支持使用bulk_create()方法批量插入数据。这样可以极大地提高插入数据的效率。

Article.objects.bulk_create([
    Article(title='title1', content='content1', user_id=1),
    Article(title='title2', content='content2', user_id=2),
    Article(title='title3', content='content3', user_id=3),
])

执行原生SQL查询

虽然Django ORM提供了许多便捷的方法,但是有些复杂的查询可能无法使用ORM来实现。这时可以使用RawSQL来执行原生SQL查询。

from django.db import connection
from django.db.models import Value
from django.db.models.functions import Coalesce

cursor = connection.cursor()
cursor.execute('SELECT COUNT(*) FROM myapp_articles WHERE is_published = 1')
num_published = cursor.fetchone()[0]

queryset = Article.objects.annotate(
    num_published=Value(num_published, output_field=models.IntegerField())
).annotate(
    num_unpublished=Coalesce('num_articles')-F('num_published')
)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django ORM高级应用方法详解 - Python技术站

(0)
上一篇 2023年3月12日
下一篇 2023年3月12日

相关文章

  • Django网络框架之HelloDjango项目创建教程

    下面我为你详细讲解” Django网络框架之HelloDjango项目创建教程” 的完整攻略,包含两条示例说明。 1. 环境准备 在开始创建 HelloDjango 项目之前,需要在本地电脑上安装好 Django 以及相关开发工具。可以在终端中输入以下命令来安装: pip install django 2. 项目创建 2.1 在终端中,切换到项目存放的目录下…

    Django 2023年5月16日
    00
  • [django]django 3种返回json方法

    django 3种返回json方法 1.手动组装字典返回 from django.http import JsonResponse, HttpResponse from django.shortcuts import render from app01.models import Book # Create your views here. def get_…

    Django 2023年4月10日
    00
  • django实现前后台交互实例

    下面我详细讲解一下“Django实现前后台交互实例”的完整攻略。 前后台交互概述 Django是一个强大的Web框架,它支持前端和后端的交互。前端是我们看到的网站界面,后端是处理数据的服务器端代码。前后端交互的目的是让前端页面可以在服务器上处理数据,并将结果返回到前端页面显示。 示例一:前后台交互表单 我们先看一个简单的示例:前后台交互的表单。假设我们有一个…

    Django 2023年5月16日
    00
  • Django报错Watching for file changes with StatReloader

    Django项目运行时出现:Watching for file changes with StatReloader错误 原因:环境里的django或者python的版本有问题 解决方案:升级或者降级Django版本 1、直接安装需要的指定版本: pip install django==2.0 或者更新版本: pip install –upgrade ***…

    Django 2023年4月11日
    00
  • Django 常用字段和参数

    一.ORM字段 类型 说明 AutoField 一个自动增加的整数类型字段。通常你不需要自己编写它,Django会自动帮你添加字段:`id = models.AutoField(primary_key=True)`,这是一个自增字段,从1开始计数。如果你非要自己设置主键,那么请务必将字段设置为`primary_key=True`。Django在一个模型中只允…

    Django 2023年4月10日
    00
  • Django From组件 fields widgets

     一.Form组件之字段 Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label标签或显示内容 initial=None, 初始值 help_text=”, 帮助信息(在标签旁边显示) error_messages=None, 错误信息 {‘required’: ‘不能为空…

    Django 2023年4月9日
    00
  • Django 状态保持搭配与存储的实现

    Django中的状态保持指的是让服务器在客户端与服务器之间保留一些信息,以便在不同请求之间共享。常用的状态保持机制有Cookie和Session。存储机制则指为了让状态保持持续生效,需要将这些信息存储在服务器的某个地方。 一、Cookie实现状态保持 Cookie是最常用的状态保持机制,在Django中使用起来也非常简单。当用户首次访问网站时,Django服…

    Django 2023年5月16日
    00
  • Django对数据库进行添加与更新的例子

    以下是Django对数据库进行添加和更新的例子: 添加数据到数据库 1. 创建模型 在 Django 中创建数据模型是一个关键的过程。它定义了数据的结构,就像数据库中的表格一样。为了创建一个模型,你需要在你的 Django 应用的 models.py 文件中定义一个 Python 类来表示你想存储的数据。下面是一个示例: from django.db imp…

    Django 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部