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']