1

Im trying to do a multiple OR search with the basic Django filter. Ive tried the below URLs already but they only return the first result

api/circuit/?search=AB5814765;AB827451;AB0923784

using a comma returns no results also.

is there any syntax that will show multiple records built in or does something custom need making, ive tried a few custom attempts but they are all failing too

using an action like the below gives me a 404 when I try to do

api/circuit/ref_search/AB5814765|AB827451|AB0923784

@action(detail=False, methods=['get'], url_path='ref_search/(?P<refs>[^/.]+)/', permission_classes=[IsAdminUser])
def ref_search(self, request, refs, *args, **kwargs):
    refs = refs.split('|')
    query = Q()
    for x in refs:
        q = Q(circuit__ref_no=x)
        query |= q
    queryset = DeviceCircuitSubnets.objects.filter(query)
    serializer = self.serializer_class(queryset, many=True)
    return Response(data=serializer.data)  

I also tried

api/circuit/ref=AB5814765|AB827451|AB0923784

def get_queryset(self):
    refs = self.request.query_params.get('ref', None)
    if refs is not None:
        refs = refs.split('|')
        query = Q()
        for x in refs:
            q = Q(status=x)
            query |= q
        queryset = queryset.filter(query)
    return queryset

my view:

class SiteCircuitDataROView(viewsets.ReadOnlyModelViewSet):
    queryset = Circuit.objects.all()
    serializer_class = CircuitSerializer
    permission_classes = (IsAdminUser,)
    filter_class = Circuit
    filter_backends = (filters.SearchFilter,)
AlexW
  • 2,843
  • 12
  • 74
  • 156

2 Answers2

2

Change your view like below

class SiteCircuitDataROView(viewsets.ReadOnlyModelViewSet):
    serializer_class = CircuitSerializer
    permission_classes = (IsAdminUser,)

    def get_queryset(self):
        queryset = Circuit.objects.all()
        search = self.request.GET.get('search', '').split(',')
        if search:
           query = Q()
           for term in search:
               query = query | Q(circuit__ref_no__icontains=term)
           queryset = queryset.filter(query)
        return queryset

Now, send request like below url

api/circuit/?search=AB5814765,AB827451,AB0923784

anjaneyulubatta505
  • 10,713
  • 1
  • 52
  • 62
1

You can do something like this, using __in and call api/circuit/?refs=AB5814765|AB827451|AB0923784

class SiteCircuitDataROView(viewsets.ReadOnlyModelViewSet):
    queryset = Circuit.objects.all()
    serializer_class = CircuitSerializer
    permission_classes = (IsAdminUser,)
    filter_class = Circuit
    filter_backends = (filters.SearchFilter,)

    @action(detail=False, methods=['get'], url_path='ref_search/', permission_classes=[IsAdminUser])
    def ref_search(self, request, *args, **kwargs):
        refs = self.request.get('refs', '').split('|')
        queryset = DeviceCircuitSubnets.objects.filter(ref__in=refs)
        serializer = self.serializer_class(queryset, many=True)
        return Response(data=serializer.data)
Gabriel Pichot
  • 2,325
  • 1
  • 22
  • 24