Filter in Django Rest Framework

Viewed 18

I'm new in DRF: ¿Can I create a filter in a function in Django Rest Framework, not created it in a Class, for use in a view? I'm trying a filter for search by: document and document_type.

Ty

My code:

#model

class Account(models.Model):
    '''Modelo para la gestión de cuentas'''
    document_type = models.CharField('Tipo documento', null=True, max_length=20, choices=DOCUMENT_TYPE)
    document = models.CharField('Documento',null=True, max_length=18)
    first_name = models.CharField('Nombres / razón social',null=True, max_length=100)
    last_name = models.CharField('Apellidos', null=True, max_length=100)
    phone = models.CharField('Teléfono fijo', max_length=7, null=True, blank=True)
    cellphone = models.CharField('Celular', max_length=10,  null=True, blank=True)
    email = models.EmailField('Correo', max_length=100, null=True, blank=True )
    address = models.CharField('Dirección', max_length=70, null=True, blank=True)
    gender = models.CharField('Genero',null=True, max_length=1, choices=GENDER_TYPE)
    affiliate_type = models.CharField('Tipo de afiliado',null=True, max_length=12, choices=AFFILIATE_TYPE)```

#view

```class AccountList(APIView):
    """
    List all accounts, or create a new account....
    """
    def get(self, request, format=None):
        account = Account.objects.all()
        serializer = AccountSerializer(account, many=True)
        filter_class = AccountFilter
        filter_backends = [filters.SearchFilter]
        return Response({'data':serializer.data},status=status.HTTP_200_OK)


    def post(self, request, format=None):
        serializer = AccountSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response({'Message':'Registro creado exitosamente'}, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)```

#filter

class AccountFilter(django_filters.rest_framework.FilterSet):

class Meta:

    model = Account
    fields = {
        'document': ['exact'], 
        'document_type': ['exact']
    }
    ordering_fields = ('document')
1 Answers

You can use self.filter_queryset(queryset) to filter queryset using filter class.

class AccountList(APIView):
    def get(self, request, format=None):
        self.filter_class = AccountFilter
        self.filter_backends = [filters.SearchFilter]
        account_qs = Account.objects.all()
        account = self.filter_queryset(account_qs)
        serializer = AccountSerializer(account, many=True)
        return Response({'data':serializer.data},status=status.HTTP_200_OK)
Related