ホームページ  >  記事  >  バックエンド開発  >  Python サーバー プログラミング: django-filter を使用したデータ フィルタリング

Python サーバー プログラミング: django-filter を使用したデータ フィルタリング

WBOY
WBOYオリジナル
2023-06-18 12:52:403745ブラウズ

Python は、近年ますます広く使用されるようになった高水準プログラミング言語です。特にサーバーサイドプログラミングでは、Python の優雅さと効率性が開発者に好まれています。

この記事では、Python サーバーサイド プログラミングの重要なツールである django-filter をデータ フィルタリングの観点から紹介します。 Pythonサーバーサイドプログラミングでdjango-filterを使いこなすために、django-filterの基本的な使い方、高度な使い方、拡張的な使い方などを紹介します。

1. django-filter とは

django-filter は、Django フレームワークのサードパーティ アプリケーションであり、開発者がデータを簡単にフィルタリングおよび並べ替えできるようにする、シンプルで柔軟なフィルタ システムを提供します。簡単に。 Django フレームワークでは、開発者にとって必須のツールである django-filter を使用してデータ フィルタリング機能を簡単に実装できます。

2. django-filter の基本的な使用法

django-filter を使用する前に、django-filter ライブラリをインストールする必要があります:

pip install django-filter

django-filter を使用するための基本的な手順フィルタは以下のようになります。

1. FilterSet クラスの作成

まず、フィルターを定義するために FilterSet クラスを作成する必要があります。 FilterSet クラスはデータ モデルに対応し、どのフィールドをフィルタリングに使用できるか、フィールドをフィルタリングする方法などを定義できます。

たとえば、単純な学生モデルがあります:

class Student(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
    grade = models.CharField(max_length=20)

次に、FilterSet クラスを作成し、フィルターとして使用できる 3 つのフィールド名、年齢、学年を定義します。

import django_filters

class StudentFilter(django_filters.FilterSet):
    class Meta:
        model = Student
        fields = ['name', 'age', 'grade']

2. view 関数で FilterSet クラスを使用する

次に、view 関数で FilterSet クラスを使用します。 FilterSet オブジェクトを作成し、それを QuerySet オブジェクトに渡し、それを使用してフィルタリングされたデータを取得できます。

from django.shortcuts import render
from django_filters.views import FilterView

def student_list(request):
    f = StudentFilter(request.GET, queryset=Student.objects.all())
    return render(request, 'student_list.html', {'filter': f})

この関数では、django-filter で提供されるビュー クラスである FilterView ビュー クラスを使用します。 FilterView は、GET リクエストとユーザー インタラクションの処理に役立ち、処理されたデータを返します。

request.GET と Student.objects.all() を FilterSet オブジェクトに渡して、ユーザーから渡されたフィルター パラメーターとすべての生徒データの QuerySet オブジェクトを取得していることに注意してください。

3. テンプレートで FilterSet クラスを使用する

最後に、フィルターをテンプレートにバインドする必要があります。テンプレートでは、フィルターに HTML フォームを提供することでユーザーからユーザー入力を取得し、それをビュー関数に送り返すことができます。

<form method="get">
    {{ filter.form.as_p }}
    <button type="submit">搜索</button>
</form>

{% if filter.qs %}
    <ul>
        {% for student in filter.qs %}
            <li>{{ student.name }} - {{ student.age }} - {{ student.grade }}</li>
        {% endfor %}
    </ul>
{% else %}
    <p>没有符合条件的数据!</p>
{% endif %}

テンプレートでは、{{ filter.form.as_p }} を通じてテンプレート内のフィルター フォームを表示します。ユーザーがフォームを送信すると、引き続き FilterSet オブジェクトを使用してユーザーの入力に基づいてフィルターされたデータを取得し、それをテンプレートに返します。

3. django-filter の高度な使用法

django-filter は、開発者がデータをより適切にフィルタリングできるようにするための多くの高度な機能を提供します。このセクションでは、カスタム フィルター、複数のフィルター条件の使用、および FilterSet での ModelChoiceFilter の使用という 3 つの高度な使用法を紹介します。

1. カスタムフィルター

まず、フィルターをカスタマイズする方法を紹介します。場合によっては、提供される組み込みフィルターがニーズを満たさない場合があります。したがって、アイデアをより適切に実装するにはフィルターをカスタマイズする必要があります。

from django.db import models
import django_filters

class StudentFilter(django_filters.FilterSet):
    GRADE_CHOICES = (
        ('1', '一年级'),
        ('2', '二年级'),
        ('3', '三年级'),
        ('4', '四年级'),
        ('5', '五年级'),
        ('6', '六年级'),
    )

    grade__gte = django_filters.ChoiceFilter(label='入学年级', choices=GRADE_CHOICES)
    age__gte = django_filters.NumberFilter(label='年龄', lookup_expr='gte')

    class Meta:
        model = Student
        fields = ['grade', 'age']

    def filter_grade__gte(self, queryset, name, value):
        if value:
            return queryset.filter(grade__gte=int(value))
        return queryset

この例では、2 つのカスタム フィルター、grade__gte と age__gte を定義します。 Grade__gte は選択フィルター、age__gte は数値フィルターです。また、カスタム フィルターのロジックを実装するために filter_grade__gte メソッドも定義します。この例では、単純な if/else を使用してデータをフィルタリングします。ニーズに応じて、フィルター メソッドにカスタム フィルター ロジックを実装できます。

2. 複数のフィルタリング条件

データをフィルタリングするために、同じフィルタで複数​​のフィルタリング条件を使用する必要がある場合があります。幸いなことに、django-filter を使用すると、このニーズを満たすために複数のフィルター条件を使用できます。

from django.db import models
import django_filters

class StudentFilter(django_filters.FilterSet):
    grade = django_filters.CharFilter(label='入学年级', lookup_expr='startswith')
    age = django_filters.NumberFilter(label='年龄', lookup_expr='lte')

    class Meta:
        model = Student
        fields = ['grade', 'age']

この例では、グレードと年齢という 2 つのフィルター条件を定義します。 Grade は startwith を使用して検索し、age は lte を使用して検索します。ニーズに応じてさまざまな検索メソッドを定義し、FilterSet で使用できます。

3. ModelChoiceFilter

場合によっては、ModelChoiceFilter フィルターを使用してモデル インスタンスを選択する必要があります。 ModelChoiceFilter を使用すると、モデルの外部キー ルックアップなどを使用してデータを処理できます。

from django.db import models
import django_filters

class GradeFilter(django_filters.FilterSet):
    name = django_filters.ModelChoiceFilter(queryset=Grade.objects.all())

    class Meta:
        model = Grade
        fields = ['name']

この例では、ModelChoiceFilter を使用して、特定のグレード名を持つ Grade インスタンスをフィルター処理します。 queryset 属性を使用して検索するオブジェクトを設定し、FilterSet クラスで ModelChoiceFilter フィルターを使用できます。

概要

この記事では、Python サーバー プログラミングの重要なツールである django-filter を紹介します。 django-filterの基本的な使い方、応用的な使い方、拡張的な使い方などを詳しく紹介しました。この内容が、Python サーバーサイド プログラミングでデータ フィルター機能を実装する際に役立つことを願っています。

以上がPython サーバー プログラミング: django-filter を使用したデータ フィルタリングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。