Как заставить этот вид класса фильтра работать, поскольку первые два вида работают?
Только начал изучать 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"),