AXV

Filtrlash, Qidiruv va Tartiblash

django-filter kutubxonasi, SearchFilter, OrderingFilter va murakkab so'rovlar

10-sinfAdvanced Python Back-end2-hafta · 6-dars

Dars rejasi

django-filter

DjangoFilterBackend, FilterSet klassi va maydonlar bo'yicha qat'iy filtrlash.

SearchFilter

To'liq matnli qidiruv: sarlavha, qisqa mazmun va matn ichidan kalit so'zlarni topish.

OrderingFilter

Natijalarni sana, ko'rishlar soni yoki sarlavha bo'yicha tartiblash.

01

Ma'lumotlarni boshqarish

Filtrlash, Qidiruv va Tartiblash farqi

Uchta asosiy boshqaruv vositasi

Har biri o'zining aniq vazifasiga ega

1. Filtrlash Aniq mezonlar ?status=published &category=1 2. Qidiruv (Search) Matnli tahlil ?search=python title, body ichidan 3. Tartiblash Joylashuv tartibi ?ordering=-published_at Eng yangilari tepada

URL Query parametrlari anatomiyasi

Barcha buyruqlar bitta qator URL orqali serverga uzatiladi

/api/v1/posts/?category=2&search=ai&ordering=-published_at Kategoriya filtri Matnli qidiruv Saralash yo'nalishi
02

django-filter sozlash

PostFilter va sana oraliqlari

src/apps/news/filters.py

import django_filters
from apps.news.models import Post

class PostFilter(django_filters.FilterSet):
    published_from = django_filters.IsoDateTimeFilter(
        field_name="published_at", lookup_expr="gte"
    )
    published_to = django_filters.IsoDateTimeFilter(
        field_name="published_at", lookup_expr="lte"
    )

    class Meta:
        model = Post
        fields = {
            "status": ["exact"],
            "category": ["exact"],
            "author": ["exact"],
            "tags": ["exact"],
        }

src/apps/news/views.py (PostViewSet)

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.select_related("category", "author") \
                           .prefetch_related("tags").all()
    lookup_field = "slug"

    filterset_class = PostFilter

    search_fields = ("title", "excerpt", "body")

    ordering_fields = ("published_at", "created_at", "title", "status")
    ordering = ("-published_at", "-created_at")
03

Indekslar va unumdorlik

Qidiruvni 100 barobar tezlashtirish siri

Nega ma'lumotlar bazasida indeks kerak?

Full Table Scan (Sekin) vs B-Tree Binary Search (Bir zumda)

Indekssiz qidiruv Full Table Scan Barcha 1 mln qatorni bittalab o'qiydi Vaqt: ~2500 ms (Juda sekin) Server protsessori qiziydi Indeksli qidiruv (B-Tree) Index Scan Kitob mundarijasidek to'g'ri topadi Vaqt: ~5 ms (Bir zumda!) 500 barobar tezroq ishlash!

Browsable API da qidiruvni sinash

http://127.0.0.1:8000/api/v1/posts/

HTTP 200 OK — Filters tugmasi o'ng tomonda faol

{
  "count": 1,
  "results": [
    {
      "id": 12,
      "title": "Sun'iy intellekt kelajagi",
      "status": "published",
      "published_at": "2026-10-04T10:00:00Z"
    }
  ]
}

Atamalarni eslab qolamiz

FilterSet

Bosing va tekshiring

Filtrlar to'plami

Model maydonlari qanday mezonlar bilan saralanishini belgilovchi sinf.

SearchFilter

Bosing va tekshiring

Matnli qidiruv

Sarlavha va matn ichidan kalit so'zlarni topib beruvchi DRF filtri.

Indeks

Bosing va tekshiring

Mundarija ko'rsatkichi

Ma'lumotlar bazasida qidiruv tezligini yuzlab barobar oshiruvchi struktura.

Tezkor bilim tekshiruvi

URL parametrida ?ordering=-published_at deb yozilganda natijalar qanday tartibda chiqadi?

To'g'ri! Maydon oldidagi minus (-) belgisi kamayish (descending) tartibini bildiradi, ya'ni eng so'nggi chop etilgan maqolalar ro'yxat boshida ko'rinadi.

Dasturchilar ko'p yo'l qo'yadigan xatolar

Xato: Barcha ma'lumotlarni filtrsiz frontendga jo'natib, saralashni brauzerda JavaScript orqali bajarish (katta trafik va xotira yo'qotiladi).
To'g'ri: Filtrlash har doim backendda — ma'lumotlar bazasi darajasida amalga oshirilishi shart.

Amaliy topshiriq 15 daqiqa

Oson pip install django-filter qilib, settings/base.py ga ulang.
O'rta apps/news/filters.py da PostFilter klassini yozing.
Qiyin PostViewSet ga filterset_class, search_fields va ordering_fields ni ulang va testlang.
AXV

2-haftani muvaffaqiyatli yakunladik!

Keyingi haftada: Pagination (Sahifalash), Throttling (Rate limiting), Fayllar bilan ishlash va Swagger dokumentatsiya!

django-filter SearchFilter OrderingFilter DB Indekslar