filter using schema

This commit is contained in:
Torrent
2025-10-16 19:47:12 +02:00
parent 55cd6d4916
commit 0a5f589c2d
2 changed files with 21 additions and 31 deletions

View File

@@ -1,7 +1,5 @@
from typing import Annotated, Optional
from annotated_types import MinLen
from django.db.models import Prefetch from django.db.models import Prefetch
from ninja import Query
from ninja.security import SessionAuth from ninja.security import SessionAuth
from ninja_extra import ControllerBase, api_controller, paginate, route from ninja_extra import ControllerBase, api_controller, paginate, route
from ninja_extra.pagination import PageNumberPaginationExtra from ninja_extra.pagination import PageNumberPaginationExtra
@@ -10,7 +8,7 @@ from ninja_extra.schemas import PaginatedResponseSchema
from api.auth import ApiKeyAuth from api.auth import ApiKeyAuth
from api.permissions import CanAccessLookup, HasPerm from api.permissions import CanAccessLookup, HasPerm
from club.models import Club, Membership from club.models import Club, Membership
from club.schemas import ClubSchema, SimpleClubSchema from club.schemas import ClubSchema, ClubSearchFilterSchema, SimpleClubSchema
@api_controller("/club") @api_controller("/club")
@@ -25,33 +23,10 @@ class ClubController(ControllerBase):
@paginate(PageNumberPaginationExtra, page_size=50) @paginate(PageNumberPaginationExtra, page_size=50)
def search_club( def search_club(
self, self,
search: Annotated[Optional[str], MinLen(1), "filter by name"] = None, filters: Query[ClubSearchFilterSchema],
club_id: Annotated[Optional[int], "filter by club id"] = None,
excluded_ids: Annotated[
Optional[list[int]], "filter by excluded club ids"
] = None,
is_active: Annotated[Optional[bool], "filter by club activity"] = None,
parent_id: Annotated[Optional[int], "filter by parent id"] = None,
parent_name: Annotated[
Optional[str], MinLen(1), "filter by parent name"
] = None,
): ):
queryset = Club.objects.all() clubs = Club.objects.all()
return filters.filter(clubs)
if search:
queryset = queryset.filter(name__icontains=search)
if club_id:
queryset = queryset.filter(id=club_id)
if is_active:
queryset = queryset.filter(is_active=is_active)
if parent_name:
queryset = queryset.filter(parent__name__icontains=parent_name)
if parent_id:
queryset = queryset.filter(parent_id=parent_id)
if excluded_ids:
queryset = queryset.exclude(id__in=excluded_ids)
return queryset.values()
@route.get( @route.get(
"/{int:club_id}", "/{int:club_id}",

View File

@@ -1,9 +1,24 @@
from ninja import ModelSchema from typing import Optional
from django.db.models import Q
from ninja import Field, FilterSchema, ModelSchema
from club.models import Club, Membership from club.models import Club, Membership
from core.schemas import SimpleUserSchema from core.schemas import SimpleUserSchema
class ClubSearchFilterSchema(FilterSchema):
search: Optional[str] = Field(None, q="name__icontains")
club_id: Optional[int] = Field(None, q="id")
is_active: Optional[bool] = None
parent_id: Optional[int] = None
parent_name: Optional[str] = Field(None, q="parent__name__icontains")
exclude_ids: Optional[list[int]] = None
def filter_exclude_ids(self, value: list[int]):
return ~Q(id__in=value)
class SimpleClubSchema(ModelSchema): class SimpleClubSchema(ModelSchema):
class Meta: class Meta:
model = Club model = Club