Как настроить отображение параметра запроса с помощью фильтрации DRF (ManyToManyfield)
Надеюсь, мой вопрос не является дубликатом.
Я создаю rest API с помощью DRF, теперь я пытаюсь сделать фильтрацию хэштегов.
Нужный мне url - article/list?hashtags=dobi
НО у меня есть id, например article/list?hashtags=13
Вот 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)
Вот мой serializers.py:
class ListSerializer(serializers.ModelSerializer):
hashtags = HashtagsSerializer(many=True)
class Meta:
model = Article
fields = ['id','title','hashtags']
Вот мой views.py:
class ArticleListAPIView(generics.ListAPIView):
queryset = Article.objects.all()
serializer_class = ListSerializer
filter_backends = [filters.SearchFilter,DjangoFilterBackend]
search_fields = ['title']
filterset_fields = ['hashtags']
Как я могу переопределить его?
Я пробовал переопределять в listapiview
lookup_url_kwarg = ['hashtags']
но это не сработало.
Думаю, вам нужно создать новый Filterset
для фильтрации поля hashtag
.
class HashTagFilter(filters.FilterSet):
hashtags = NumberFilter(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']
В ArticleListAPIView
необходимо установить filterset_class
.
class ArticleListAPIView(generics.ListAPIView):
queryset = Article.objects.all()
serializer_class = ListSerializer
filter_backends = [filters.SearchFilter,DjangoFilterBackend]
filterset_class = HashtagFilter
search_fields = ['title']