既然前两个视图正在工作,我如何让这个过滤器类视图工作?

问题描述 投票:0回答:1

刚开始学习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)
    
python django django-rest-framework
1个回答
0
投票

url 配置中的第一个 (

Blockpost-view-create
) 和第三个 (
Filter
) 路径是相同的。

由于 django 使用第一个匹配路径,因此它永远不会到达名为

Filter
的路径。

© www.soinside.com 2019 - 2024. All rights reserved.