Как заставить этот вид класса фильтра работать, поскольку первые два вида работают?

Только начал изучать django. Я не могу заставить работать фильтрацию для этого:

views.py:

class BlogPostList(APIView):
    def get(self, request, format=None):
        title = request.query_params.get("title", "")
        
        if title:
            blog_posts = BlogPost.objects.filter(title_icontains=title)
        else:
            blog_posts = BlogPost.objects.all()
        
        serializer = BlogPostSerializer(blog_posts, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

urls.py:

urlpatterns = [
    path("blogposts/", views.BlogPostListCreate.as_view(), name="Blogpost-view-create"),
    path("blogposts/<int:pk>/", views.BlogPostRetrieveUpdateDestroy.as_view(), name="update"),
    path("blogposts/", views.BlogPostList.as_view(), name="Filter"),

]

первые два представления работают. models.py:

from django.db import models

# Create your models here.
class BlogPost(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    published_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

Вот полный код файла views.py:

from django.shortcuts import render
from rest_framework import generics, status
from rest_framework.response import Response
from .models import BlogPost
from .serializers import BlogPostSerializer
from rest_framework.views import APIView

# Create your views here.


class BlogPostListCreate(generics.ListCreateAPIView):
    queryset = BlogPost.objects.all()
    serializer_class = BlogPostSerializer

    def delete(self, request, *args, **kwargs):
        BlogPost.objects.all().delete()
        return Response(status=status.HTTP_204_NO_CONTENT)



class BlogPostRetrieveUpdateDestroy(generics.RetrieveUpdateDestroyAPIView):
    queryset = BlogPost.objects.all()
    serializer_class = BlogPostSerializer
    lookup_field = "pk"

class BlogPostList(APIView):
    def get(self, request, format=None):
        title = request.query_params.get("title", "")
        
        if title:
            blog_posts = BlogPost.objects.filter(title_icontains=title)
        else:
            blog_posts = BlogPost.objects.all()
        
        serializer = BlogPostSerializer(blog_posts, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)
    

Первый (Blockpost-view-create) и третий (Filter) пути в вашей конфигурации url идентичны.

Поскольку django использует первый подходящий путь, он никогда не достигнет пути с именем Filter.

Во-первых, убедитесь, что все ваши пути к url уникальны.

В представлении BlogPostList вы не фильтруете, используя иконки с одинарным подчеркиванием, вместо этого используйте следующий запрос:

blog_posts = BlogPost.objects.filter(title_icontains=title)

Правильно будет:

blog_posts = BlogPost.objects.filter(title__icontains=title)

Добавьте это к url path("blogposts/search/", views.BlogPostList.as_view(), name="blogpost-search"),

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