Using custom methods in filter with django-rest-framework Using custom methods in filter with django-rest-framework django django

Using custom methods in filter with django-rest-framework


Use the 'action' parameter to specify a custom method - see django-filter docs

First define a method that filters a queryset using the value of the category parameter:

    def filter_category(queryset, value):        if not value:            return queryset        queryset = ...custom filtering on queryset using 'value'...        return queryset

Listing filter should look like this:

    class ListingFilter(django_filters.FilterSet):        ...        category = django_filters.CharFilter(action=filter_category)        ...


For sake of database speed, you should just add the category to your listing model

class Listing(models.Model):    product = models.OneToOneField(Product, related_name='listing')    category = models.ForeignKey(Category)

Then use a post_save signal to keep the field updated

from django.dispatch import receiverfrom django.db.models.signals import post_save@receiver(post_save, sender=Product)def updateCategory(sender, instance, created, update_fields, **kwargs):    product = instance    product.listing.category = product.assets[0].category.name    product.listing.save()

Then filter by it's name as you would any other field:

class ListingFilter(django_filters.FilterSet):    ...    category = django_filters.CharFilter(name='category__name')    ...