📜  在 django 列表中过滤外部查询集 - Python (1)

📅  最后修改于: 2023-12-03 14:50:54.390000             🧑  作者: Mango

在 Django 列表中过滤外部查询集

在 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 模型来实现这一点。