0

I have the following view I have implemented to filter transactions depending on a certain query provided. Is there a way I could filter dynamically depending on what query is provided, for example one would want to only query year and month only or even filter using one query. The rest of the query values will end up having a None value an should not be included in the filter.

class ReportTransactionsFilterAPIView(APIView):
    def get(self, request, format=None):

        year = self.request.GET.get('year')
        month = self.request.GET.get('month')
        subcounty = self.request.GET.get('subcounty')
        ward = self.request.GET.get('ward')

        fromDate = self.request.GET.get('fromDate')
        toDate = self.request.GET.get('toDate')   

        qs = LiquorReceiptTrack.objects.all()
        qs = LiquorReceiptTrack.objects.filter(
            Q(date_recieved__range=[fromDate,toDate])|
            Q(date_recieved__year=year)|
            Q(date_recieved__month=month)|
            Q(sub_county__iexact=subcounty)|
            Q(ward__iexact=ward)

        )

3 Answers 3

1

You can use django-filter for your solution. Also for more information you can visit https://www.django-rest-framework.org/api-guide/filtering/

Sign up to request clarification or add additional context in comments.

Comments

0

Just use if, why Q do you use here?:

year = self.request.GET.get('year')
month = self.request.GET.get('month')
subcounty = self.request.GET.get('subcounty')
ward = self.request.GET.get('ward')

fromDate = self.request.GET.get('fromDate')
toDate = self.request.GET.get('toDate')   

qs = LiquorReceiptTrack.objects.all()
if year:
    qs = qs.filter(date_recieved__year=year)
if month:
    qs = qs.filter(date_recieved__month=month)
...

Comments

0

Went over the django-filter documentation and refactored the list view:

class TransactionFilter(django_filters.FilterSet):

    date_range = DateFromToRangeFilter()
    month = django_filters.NumberFilter(field_name='date_recieved', lookup_expr='month')
    year = django_filters.NumberFilter(field_name='date_recieved', lookup_expr='year')
    date = django_filters.DateFilter(field_name='date_recieved', lookup_expr='exact')
    sub_county = django_filters.CharFilter(lookup_expr='icontains')
    ward = django_filters.CharFilter(lookup_expr='icontains')


    class Meta:
        model = LiquorReceiptTrack
        fields = ['date','month','year','date_range','sub_county','ward']

class ReportTransactionsFilterAPIView(generics.ListAPIView):


    queryset = LiquorReceiptTrack.objects.all()
    serializer_class = ReceiptDetailSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = TransactionFilter

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.