How to implement case-insensitive in SlugRelatedField in drf serializers?

148 views Asked by At

I'm using SlugRelatedField in my serializer. I want to validate it on a case-insensitive basis, so I add postfix "__iexact" to the "slug_field" attr. And validation works as I need (case-insensitive).

class MySerializer(ModelSerializer):
    customer = serializers.SlugRelatedField(queryset=Customer.objects.all(),
                                            required=False,
                                            allow_null=True,
                                            slug_field='name__iexact')

But when I try to get serializer.data, the following error occurs:
* {AttributeError}'Customer' object has no attribute 'name__iexact'
How can it be solved?

1

There are 1 answers

1
JPG On BEST ANSWER

AFAIK, there is no official implementation to make that happen - but, you can create a custom field out of SlugRelatedField(...) something like below,

from rest_framework.relations import SlugRelatedField


class CustomSlugRelatedField(SlugRelatedField):
    def __init__(self, *args, lookup_expr="", **kwargs):
        super().__init__(**kwargs)
        self._slug_field = self.slug_field
        if lookup_expr:
            self.slug_field = f"{self.slug_field}__{lookup_expr}"

    def to_representation(self, obj):
        return getattr(obj, self._slug_field)

and use it as

class MySerializer(ModelSerializer):
    customer = CustomSlugRelatedField(
        queryset=Customer.objects.all(),
        required=False,
        allow_null=True,
        slug_field='name',
        lookup_expr='iexact',
    )