У меня есть проблема, когда я хочу фильтровать по имени источника (которое связано с таблицей, связанной с главной таблицей, которую я сериализирую)
Для моих фильтров я использую 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 представлений, которыеТип видео