Перейти к содержимому

Фильтрация по сайтам

Для того чтобы добавить фильтрацию объектов по сайтам можно добавить свою функцию фильтрации в глобальную область.

  • Эта функция будет вызываться из системной зависимости endpoint’ов.
  • Результаты предыдущего фильтра будут добавляться к результату следующего.

Пример того как это можно сделать:

from django.contrib.sites.models import Site
from django.db.models import QuerySet
from django.db.utils import ProgrammingError
from djing2.fastapi.sites_depend import add_site_filter
from 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 по текущему сайту если он доступен(передан).