Janitha Nawarathna
Janitha Nawarathna

Reputation: 319

How to add username to the filterset_fields in views Django Rest Framework where the user is the foreign key of the model?

I have below model in my models.py which has the django User model as the foreign key and I want to add username into the filterset_fields in my views in order to filter the user employment by username instead of user id. Any help would be great! Thank you!

class UserEmployment(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='employment')
    position = models.TextField(blank=True)
    company = models.TextField(blank=True)
    start_year = models.IntegerField(blank=True, null=True)
    end_year = models.IntegerField(blank=True, null=True)
    currently_work = models.BooleanField(default=False)

Serializer class,

class UserEmploymentSerializer(serializers.ModelSerializer):

    class Meta:
        model = UserEmployment
        fields = ['id', 'user', 'position', 'company', 'start_year', 'end_year', 'currently_work']

View class,

class UserEmploymentViewSet(viewsets.ModelViewSet):

    queryset = UserEmployment.objects.all()
    serializer_class = UserEmploymentSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['user'] # I want this to be 'username' in order to filter employment list by username
    http_method_names = ['get']

Thank you!

Upvotes: 1

Views: 4272

Answers (2)

Janitha Nawarathna
Janitha Nawarathna

Reputation: 319

This also works fine,

class UserEmploymentViewSet(viewsets.ModelViewSet):

    queryset = UserEmployment.objects.all()
    serializer_class = UserEmploymentSerializer
    filter_backends = [DjangoFilterBackend]
    http_method_names = ['get']

    def get_queryset(self):
    
        queryset = UserEmployment.objects.all()
        username = self.request.query_params.get('username', None)
        if username is not None:
            queryset = queryset.filter(user__username=username)
        return queryset

Reference: https://www.django-rest-framework.org/api-guide/filtering/#filtering-against-query-parameters

Upvotes: -1

Utkucan Bıyıklı
Utkucan Bıyıklı

Reputation: 1117

You can use filterset_class attr.

from django_filters import rest_framework
class UserEmploymentFilter(rest_framework.FilterSet):
    username = rest_framework.CharFilter(field_name='user__username', lookup_expr='iexact')

    class Meta:
        fields = ("username",)
        model = UserEmployment
    

And your view should be like this

class UserEmploymentViewSet(viewsets.ModelViewSet):

    queryset = UserEmployment.objects.all()
    serializer_class = UserEmploymentSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_class = UserEmploymentFilter
    http_method_names = ['get']

After that you can search with ?username=foo

Upvotes: 3

Related Questions