Home > database >  How to customize showing query parameter with DRF filtering (ManyToManyfield)
How to customize showing query parameter with DRF filtering (ManyToManyfield)

Time:07-25

I hope my question is not a duplicated..

I'm building a rest API with DRF, now I'm trying to do filtering hashtag.

The url I want is article/list?hashtags=dobi

BUT I got id, like article/list?hashtags=13

Here is models.py:

class Article(AbstractTimeStamp):
    user = models.ForeignKey('users.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=300,blank=False)
    content = models.TextField(max_length=1000)
    hashtags = models.ManyToManyField('Hashtag', max_length=200, related_name='articles', blank=True)


class Hashtag(models.Model):
    hashtag = models.CharField(max_length=200, unique=True, blank=True)

Here is my serializers.py:

class ListSerializer(serializers.ModelSerializer):

    hashtags = HashtagsSerializer(many=True)

    class Meta:
        model = Article
        fields = ['id','title','hashtags']

Here is my views.py:

class ArticleListAPIView(generics.ListAPIView):
    queryset = Article.objects.all()
    serializer_class = ListSerializer
    filter_backends = [filters.SearchFilter,DjangoFilterBackend]

    search_fields = ['title']

    filterset_fields = ['hashtags']

How can I override it? I tried overriding in listapiview lookup_url_kwarg = ['hashtags']

but it didn't work.

CodePudding user response:

I think you need to create a new Filterset for filtering the field hashtag.

class HashTagFilter(filters.FilterSet):
    hashtags = CharFilter(method='filter_hashtags')

    def filter_hashtags(self, queryset, name, value):
        lookup = '__'.join([name, 'hashtag'])
        return queryset.filter(**{lookup: value})


    class Meta:
        model = Article
        fields = ['hashtags']

And in ArticleListAPIView, you need to set filterset_class.

class ArticleListAPIView(generics.ListAPIView):
    queryset = Article.objects.all()
    serializer_class = ListSerializer
    filter_backends = [filters.SearchFilter,DjangoFilterBackend]
    filterset_class = HashtagFilter
    search_fields = ['title']

    
  • Related