Фильтр отдыха Django по имени вложенного ключа - PullRequest
0 голосов
/ 16 октября 2019

У меня есть проблема, когда я хочу фильтровать по имени источника (которое связано с таблицей, связанной с главной таблицей, которую я сериализирую)
Для моих фильтров я использую django-filter module
Мой serializers.py может дать представление о том, что происходит

class FilterSerializer(serializers.ModelSerializer):
    owner_name = serializers.CharField(source='owner.name')
    source = serializers.CharField(source='source.trend_type.mnemonic')
    class Meta:
        model = TrendData
        fields = [obj.name for obj in TrendData._meta.fields if obj.name not in ['owner', 'id','source']]
        fields.insert(0, 'owner_name')
        fields.append('source')
#code is still in dev mode, i will refactor all the inserts/append ofc :)

, и мои просмотры + набор фильтров выглядят так

class GlobalFilterSet(filters.FilterSet):
    class Meta:
        model = TrendData
        field_list = ['gte', 'lte', 'range','exact', 'icontains']
        fields = {
            'date_trend': field_list,
            'views':field_list,
            'views_u' : field_list,
            'likes': field_list,
            'shares': field_list,
            'interaction_rate': field_list,
            'mean_age': field_list,
            'er_reach_day_1': field_list,
            'er_reach_day_2': field_list,
            'lr_4': field_list,
            'sr_5': field_list,
            'vur_1': field_list,
            'views_pos': field_list,
            'views_u_pos': field_list,
            'likes_pos': field_list,
            'shares_pos': field_list,
            'interaction_rate_pos': field_list,
            'mean_age_pos': field_list,
            'er_reach_day_1_pos': field_list,
            'er_reach_day_2_pos': field_list,
            'lr_4_pos': field_list,
            'sr_5_pos': field_list,
            'vur_1_pos': field_list,
            'source': ['exact'] ## <  I want to filter by this name
            #TODO more fields to filter
        }
        ordering = ['-views']

class GlobalFilter(MixInTrendsAPIView):

    queryset = TrendData.objects.all()
    filter_backends = [DjangoFilterBackend]
    serializer_class = FilterSerializer
    filterset_class = GlobalFilterSet
    pagination_class = CustomPagination
    pagination_class.page_size = 10
    ordering_fields= '__all__'

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        if request.GET.get('sort_by', 0):
            queryset = queryset.order_by('-'+ request.GET['sort_by'])
            if request.GET.get('sort_order', 0) == 'asc':
                queryset = queryset.order_by(request.GET['sort_by'])

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

Мне нужна возможность фильтрации по мнемоническому источнику. В serializers.py вы можете видеть, что это связано с еще одним экземпляром таблицы, поэтому я не уверен, как фильтровать по мнемоническому.
Например, следующий URL api/trends/?views__gte=100000&source_type=video должен возвращать данные с более чем 100000 представлений, которыеТип видео

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...