Filter into Foreign Keys on Django-Rest Datatables

Viewed 128

I have a datatable for Order model which contains some fields from User model and is implemented using serializer as following

serializers.py

# customer order detail serializer
class CustomerOrderSerializer(serializers.ModelSerializer):
    first_name = serializers.ReadOnlyField(source='user.first_name')
    last_name = serializers.ReadOnlyField(source='user.last_name')

    def __init__(self, *args, **kwargs):
        remove_fields = kwargs.pop('remove_fields', None)
        super(CustomerOrderSerializer, self).__init__(*args, **kwargs)

        if remove_fields:
            for field_name in remove_fields:
                self.fields.pop(field_name)

    class Meta:
        model = Order
        fields = ['id', 'amount', 'order_status', 'created', 'first_name', 'last_name']
        read_only_fields = ['issue_date', 'first_name', 'last_name']

In views.py

class OrderList(generics.ListAPIView):
    queryset = Order.objects.order_by('-created')
    serializer_class = CustomerOrderSerializer

I am successfully able to get first_name & last_name fields as in datatable format as shown

enter image description here

However, my requirements is to filter/search in datatable on fields first_name & last_name which are from different model User

when I try to filter on those fields I get Following error:

Cannot resolve keyword 'first_name' into field. Choices are: ..., .., ..., .. 

Can anyone help me understand, How we can filter on foreign key fields in django-rest datatables

1 Answers

You can use SearchFilter.doc

from rest_framework import filters

class OrderList(generics.ListAPIView):
    queryset = Order.objects.order_by('-created')
    serializer_class = CustomerOrderSerializer
    filter_backends = [filters.SearchFilter]
    search_fields = ['user__first_name', 'user__last_name']

After that, you can search first name & last name by ?search=foo query parameter.

Related