Как настроить отображение параметра запроса с помощью фильтрации 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']

    
Вернуться на верх