Python使用Django的自定义查询方法

2024年 3月 4日 79.9k 0

Django是一个基于Python的Web框架,它提供了强大的ORM(对象关系映射)系统,可以方便地进行数据库操作。Django的ORM系统支持多种查询方式,包括原生SQL查询、ORM查询、QuerySet查询等。其中,自定义查询是一种非常常见和实用的查询方式,它允许开发者根据自己的需求,自定义特定的查询方式,以便更好地满足业务需求。

自定义查询是指在Django中,通过编写特定的查询函数或方法,实现对数据库数据的查询和过滤。自定义查询函数或方法可以接受各种参数,包括关键字参数、位置参数、可变参数和关键字可变参数等,以便更灵活地满足不同的查询需求。自定义查询可以用于实现各种复杂的数据查询和过滤,如分组查询、聚合查询、多表联查等。

用法

Django的自定义查询功能非常强大和灵活,可以用于各种场景。使用自定义查询的基本步骤如下:

  • 创建一个查询函数或方法,命名通常以get_或filter_等开头,以便区分系统自带的查询函数或方法。
  • 在查询函数或方法中,使用Django的QuerySet API对数据库进行查询和过滤。QuerySet API提供了丰富的查询方法,包括filter、exclude、annotate、aggregate等方法,可以满足各种查询需求。
  • 在视图函数中调用查询函数或方法,传递必要的参数,以获取查询结果。

下面是一个简单的自定义查询函数的例子:

from django.db.models import Q

def get_articles_by_keyword(keyword):
    return Article.objects.filter(Q(title__icontains=keyword) | Q(content__icontains=keyword))

上面的代码中,我们定义了一个名为get_articles_by_keyword的查询函数,它接受一个关键字参数keyword,用于查询文章标题和内容中包含关键字的文章。在函数中,我们使用了Django的QuerySet API中的filter方法和Q对象,实现了查询条件的拼接和查询结果的过滤。

使用步骤

下面是使用自定义查询的步骤:

  • 定义一个自定义查询函数或方法,命名通常以get_或filter_等开头,以便区分系统自带的查询函数或方法。
  • 在查询函数或方法中,使用Django的QuerySet API对数据库进行查询和过滤。QuerySet API提供了丰富的查询方法,可以满足各种查询需求。
  • 在视图函数中调用查询函数或方法,传递必要的参数,以获取查询结果。

下面是一个使用自定义查询的例子:

# models.py

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()

# utils.py

from django.db.models import Q

def get_articles_by_keyword(keyword):
    return Article.objects.filter(Q(title__icontains=keyword) | Q(content__icontains=keyword))

# views.py

from django.shortcuts import render
from .utils import get_articles_by_keyword

def search(request):
    keyword = request.GET.get('keyword', '')
    articles = get_articles_by_keyword(keyword)
    return render(request, 'search.html', {'articles': articles})

上面的代码中,我们定义了一个名为get_articles_by_keyword的查询函数,用于查询文章标题和内容中包含关键字的文章。在视图函数search中,我们调用了查询函数,并将查询结果传递给模板渲染,以展示查询结果。

常用方法代码示例

Django的QuerySet API提供了丰富的查询方法,包括filter、exclude、annotate、aggregate等方法,可以满足各种查询需求。下面是一些常用的查询方法的代码示例:

filter

filter方法用于对查询结果进行过滤,可以传递多个查询条件,多个条件之间是"与"的关系。下面是一个查询文章标题中包含关键字的文章的例子:

articles = Article.objects.filter(title__icontains='keyword')

exclude

exclude方法用于排除满足指定查询条件的结果,可以传递多个查询条件,多个条件之间是"与"的关系。下面是一个排除文章标题中包含关键字的文章的例子:

articles = Article.objects.exclude(title__icontains='keyword')

annotate

annotate方法用于对查询结果进行注释,可以添加统计信息、计算信息等。下面是一个统计每篇文章的评论数的例子:

from django.db.models import Count

articles = Article.objects.annotate(comment_count=Count('comments'))

aggregate

aggregate方法用于对查询结果进行聚合计算,可以添加聚合函数,如Sum、Avg、Min、Max等。下面是一个统计所有文章的阅读量的例子:

from django.db.models import Sum

total_views = Article.objects.aggregate(total_views=Sum('views'))

一套完整可运行的代码

下面是一套完整可运行的使用自定义查询的代码示例:

models.py

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()
    views = models.IntegerField(default=0)

class Comment(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments')
    content = models.TextField()

上面的代码中,我们定义了两个模型类Article和Comment,分别表示文章和评论。Article类有三个字段,分别是title、content和views,分别表示文章标题、内容和阅读量;Comment类有两个字段,分别是article和content,分别表示评论所属的文章和评论内容。

utils.py

from django.db.models import Q

def get_articles_by_keyword(keyword):
    return Article.objects.filter(Q(title__icontains=keyword) | Q(content__icontains=keyword))

def get_articles_by_views():
    return Article.objects.order_by('-views')

def get_comments_by_article(article_id):
    return Comment.objects.filter(article_id=article_id)

上面的代码中,我们定义了三个自定义查询函数,分别表示根据关键字查询文章、按阅读量排序查询文章和根据文章ID查询评论。这些查询函数都使用了Django的QuerySet API进行查询和过滤。

views.py

from django.shortcuts import render, get_object_or_404
from .models import Article
from .utils import get_articles_by_keyword, get_articles_by_views, get_comments_by_article

def index(request):
    articles = get_articles_by_views()[:10]
    return render(request, 'index.html', {'articles': articles})

def article_detail(request, article_id):
    article = get_object_or_404(Article, pk=article_id)
    comments = get_comments_by_article(article_id)
    return render(request, 'article_detail.html', {'article': article, 'comments': comments})

def search(request):
    keyword = request.GET.get('keyword', '')
    articles = get_articles_by_keyword(keyword)
    return render(request, 'search.html', {'articles': articles})

上面的代码中,我们定义了三个视图函数,分别表示展示最热门的10篇文章、展示文章详情和展示搜索结果。这些视图函数都调用了自定义查询函数,从数据库中获取数据,并将结果传递给模板渲染。

templates/index.html

{% extends 'base.html' %}

{% block content %}
最热门的10篇文章
    {% for article in articles %}
  • {{ article.title }}
  • {% endfor %}
{% endblock %}

上面的代码中,我们定义了一个模板index.html,用于展示最热门的10篇文章。在模板中,我们使用了Django的模板语言,遍历了文章列表,并为每篇文章添加了超链接,以便用户点击查看文章详情。

templates/article_detail.html

{% extends 'base.html' %}

{% block content %}
{{ article.title }}

{{ article.content }}

阅读量:{{ article.views }}

评论

    {% for comment in comments %}
  • {{ comment.content }}
  • {% empty %}
  • 没有评论
  • {% endfor %}
{% endblock %}

上面的代码中,我们定义了一个模板article_detail.html,用于展示文章详情和评论。在模板中,我们使用了Django的模板语言,展示了文章的标题、内容和阅读量,以及评论列表。

templates/search.html

{% extends 'base.html' %}

{% block content %}
搜索结果

  
  搜索

    {% for article in articles %}
  • {{ article.title }}
  • {% empty %}
  • 没有匹配结果
  • {% endfor %}
{% endblock %}

上面的代码中,我们定义了一个模板search.html,用于展示搜索结果。在模板中,我们使用了Django的模板语言,展示了搜索框和搜索结果列表,以便用户查看搜索结果。

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('article//', views.article_detail, name='article_detail'),
    path('search/', views.search, name='search'),
]

上面的代码中,我们定义了路由规则,将URL路径与视图函数对应起来。其中,index路径对应index视图函数,用于展示最热门的10篇文章;article//路径对应article_detail视图函数,用于展示文章详情;search路径对应search视图函数,用于展示搜索结果。我们在路由规则中使用了这样的URL参数,将文章ID作为参数传递给视图函数。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论