📜  如何使用带有视图集的 django-filters - Python (1)

📅  最后修改于: 2023-12-03 15:38:08.108000             🧑  作者: Mango

如何使用带有视图集的 django-filters

介绍

django-filters是Django中使用过滤器的一种方法,能够让你快速创建过滤数据的API视图。在本文中,我们将深入探讨如何使用带有视图集的django-filters。视图集是在Django REST框架中的一种常用函数式视图类型,用于快速实现常见的HTTP操作(如GET、POST等)。

环境和前提条件

在继续阅读本文之前,请确保您满足以下环境和前提条件: 1.已经安装好Python 3.x。 2.熟悉了Django开发以及Django REST框架。

使用django-filters

首先,您需要使用以下命令安装django-filters:

pip install django-filters
1. 创建模型

我们将使用以下示例模型来演示如何使用django-filters:

from django.db import models

class Movie(models.Model):
    name = models.CharField(max_length=200)
    genre = models.CharField(max_length=200)
    year = models.IntegerField()
2. 安装django-filter和rest_framework
pip install django-filter djangorestframework
3. 序列化器

使用ModelSerializer创建序列化器,如下所示:

from rest_framework import serializers
from .models import Movie

class MovieSerializer(serializers.ModelSerializer):
    class Meta:
        model = Movie
        fields = '__all__'
4. 视图
from rest_framework import viewsets
from django_filters.rest_framework import DjangoFilterBackend
from .models import Movie
from .serializers import MovieSerializer

class MovieViewSet(viewsets.ModelViewSet):
    serializer_class = MovieSerializer
    queryset = Movie.objects.all()
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'genre', 'year']

现在你可以开始访问你的API了!

GET /movies/ HTTP/1.1
Host: localhost:8000
Content-Type: application/json

你可以将查询参数添加到URL中,如下所示:

GET /movies/?name=The%20Godfather&year=1972 HTTP/1.1
Host: localhost:8000
Content-Type: application/json
5. 更高级的例子

你也可以在视图集上使用FilterSet以过滤多个模型:

from django_filters import rest_framework as filters

class MovieFilter(filters.FilterSet):
    min_year = filters.NumberFilter(field_name='year', lookup_expr='gte')
    max_year = filters.NumberFilter(field_name='year', lookup_expr='lte')
    name = filters.CharFilter(field_name='name', lookup_expr='icontains')
    genre = filters.CharFilter(field_name='genre', lookup_expr='icontains')

    class Meta:
        model = Movie
        fields = ['name', 'genre', 'min_year', 'max_year']

class MovieViewSet(viewsets.ModelViewSet):
    serializer_class = MovieSerializer
    queryset = Movie.objects.all()
    filter_backends = [DjangoFilterBackend]
    filterset_class = MovieFilter
结论

django-filters提供了一种快速和灵活地过滤API中的数据。它通常与Django REST框架一起使用,但也可以直接与Django一起使用。此外,使用视图集将为您的RESTful API提供更好的可读性和性能。希望这篇文章能够帮助你学习如何使用django-filters并创建出更好的API视图!

参考链接

django-filter官方文档