def get_children(self, obj: Section) -> typing.List[dict]: """ Возвращает потомков сериализованных потомком пункта меню """ result = [] if 'sections' in self.context: # получение дочерних разделов из контекста сверху children_items = list( filter(lambda i: i.parent_id == obj.id, self.context['sections'])) if len(children_items) > 0: result = SectionHierarchySerializer(children_items, many=True, context=self.context).data else: # получение дочерних разделов запросом в БД request = self.context.get('request') site = self._get_current_site(request) if request else None query = Q(is_deleted=False) & Section.get_filter_query_by_site( site if site else None) queryset = obj.get_children()\ .extra( **Section.get_extrafilter_ordering_by_site(site) )\ .filter(query)\ .prefetch_related('settings')\ .order_by('ordering', 'order')\ .distinct() # фильтрация отключенных разделов в адмикнке сайта if request and site and request.GET.get('is_active') == 'true': queryset = queryset.extra( **Section.get_extrafilter_active_by_site(site)) result = SectionHierarchySerializer(queryset, many=True, context=self.context).data return result
def get_queryset(self): site = self._get_current_site(self.request) query = Section.get_deleted_query(self.request.user) if site: query &= Section.get_filter_query_by_site(site) else: if not self.request.user.is_staff: query &= Q(id__isnull=True) return super(SectionView, self).get_queryset().filter(query)\ .extra( **Section.get_extrafilter_ordering_by_site(site) )\ .prefetch_related('settings')\ .order_by('ordering', 'order')\ .distinct()