📅  最后修改于: 2023-12-03 14:50:54.390000             🧑  作者: Mango
在 Django 中,我们经常需要在视图中过滤外部查询集以获得特定的数据。这在很多情况下非常有用,比如搜索、排序和分页。
Django 的查询集具有强大的筛选器功能,可以轻松地通过链式调用过滤方法来过滤查询集。以下是一些常用的筛选器方法:
filter()
:返回与给定条件匹配的对象。多个条件可以用逗号分隔,它们将在 SQL WHERE 子句中组合起来。exclude()
:返回不符合给定条件的对象。order_by()
:按指定的顺序对查询集进行排序。values()
:返回特定字段值的一个 QuerySet,而不是对象实例。以下是一个使用筛选器方法的示例:
from django.shortcuts import render
from django.views.generic.list import ListView
from .models import Book
class BookList(ListView):
model = Book
context_object_name = 'books'
template_name = 'book_list.html'
def get_queryset(self):
queryset = super().get_queryset()
queryset = queryset.filter(author__icontains='Hemingway')
queryset = queryset.order_by('-published_date')
return queryset
在这个例子中,我们重写了 ListView 视图的 get_queryset() 方法,以过滤所有作者包含“Hemingway”的书,并按前发布日期降序排序。
有时,我们希望使用外部查询集中的数据过滤 Django 中的查询集。一种常见的方法是使用双下划线语法连接外部查询集和 Django 模型,如下所示:
from django.shortcuts import render
from django.views.generic.list import ListView
from .models import Book
from external_app.models import Author
class BookList(ListView):
model = Book
context_object_name = 'books'
template_name = 'book_list.html'
def get_queryset(self):
author = Author.objects.get(name='Hemingway')
queryset = super().get_queryset()
queryset = queryset.filter(author__id=author.id)
queryset = queryset.order_by('-published_date')
return queryset
在这个例子中,我们通过名称从外部应用程序的 Author 模型中获取了作者对象。然后,我们在 Django 的模型中使用双下划线语法连接外部应用程序的模型和查询集,并过滤出与作者对象相匹配的书籍。
Django 的筛选器方法使过滤查询集变得十分简单。如果您需要使用外部查询集来筛选 Django 的查询集,您可以使用双下划线语法连接外部应用程序和 Django 模型来实现这一点。