Фильтрация по сайтам
Для того чтобы добавить фильтрацию объектов по сайтам можно добавить свою функцию фильтрации в глобальную область.
- Эта функция будет вызываться из системной зависимости endpoint’ов.
- Результаты предыдущего фильтра будут добавляться к результату следующего.
Пример того как это можно сделать:
from django.contrib.sites.models import Sitefrom django.db.models import QuerySetfrom django.db.utils import ProgrammingError
from djing2.fastapi.sites_depend import add_site_filterfrom profiles.models import UserProfile
def example_sites_filter( qs: QuerySet, curr_site: Site | None, curr_user: UserProfile, field_name='site', plural_field_name='sites') -> QuerySet: if curr_user.is_superuser: return qs
rqs = qs
if curr_site: if isinstance(qs, QuerySet): model = qs.model else: model = qs if hasattr(model, str(plural_field_name)): rqs = qs.filter(**{ plural_field_name: curr_site }) elif hasattr(model, str(field_name)): rqs = qs.filter(**{ field_name: curr_site }) else: raise ProgrammingError( f'Model "{model}" has no field ' f'"{plural_field_name}" nor "{field_name}"' )
return rqs
add_site_filter(example_sites_filter)Тут пытаемся отфильтровать Queryset по текущему сайту если он доступен(передан).