Search code examples
djangodjango-modelsdjango-rest-frameworkdjango-filter

Django-filter filter by related fields


I have two tables.

class Writer(models.Model)
    name = model.CharField()
    ...

class Article(models.Model)
    name = model.CharField()
    writer = model.ForeignKey('Writer', related_name="relationship") 
    ...

I wanted to build some API endpoints getting the writer list, but this should be filterable by Article id. I am using django-filter. So:

class WriterViewSet(viewsets.ReadOnlyModelViewSet):
   filter_backend = [filters.djangoFilterBackend],
   filter_class = WriterFilter


class WriteFilter(django_filters.rest_framework.FilterSet):
....

So my concern is, how can I define WriteFilter to filter Writer by the article?


Solution

  • class WriteFilter(django_filters.rest_framework.FilterSet):
        article = django_filters.CharFilter(name='relationship__name', lookup_expr='contains')
    
        class Meta:
            model = WriterFilter
            fields = ['article']
    


    Your url will be like this,
    /api/wtiter/list/?article=somearticlename


    UPDATE-1

    since django-filter 2.0, the name argument changed to field_name.

    Hence the filter class will be,

    class WriteFilter(django_filters.rest_framework.FilterSet):
        article = django_filters.CharFilter(field_name='relationship__name', lookup_expr='contains')
    
        class Meta:
            model = WriterFilter
            fields = ['article']