簡體   English   中英

過濾器,標題在 Django rest 框架中不起作用

[英]Filter for slug, title not working in Django rest Framework

我正在嘗試進行動態搜索,但似乎無法按 slug 過濾查詢集。 我幾乎嘗試了所有方法,並通過了 stackoverflow 問題,但似乎沒有任何解決方法。 我嘗試將關鍵字更改為“id”和“category”,但我得到了結果,但沒有在 slug 上。
是我收到的錯誤/無查詢集。
是我為作者制作的過濾器,似乎有效。
這是代碼,請告知我是否需要提供更多代碼來理解問題,因為這是我在這里的第一個問題。 謝謝!

blog_api/views.py

from rest_framework import generics
from blog.models import Post
from .serializers import PostSerializer
from rest_framework.permissions import SAFE_METHODS, IsAuthenticated, IsAuthenticatedOrReadOnly, BasePermission, IsAdminUser, DjangoModelPermissions
from rest_framework import viewsets
from rest_framework import filters
from django.shortcuts import get_object_or_404
from rest_framework.response import Response


class PostUserWritePermission(BasePermission):
    message = 'Editing posts is restricted to the author only.'

    def has_object_permission(self, request, view, obj):

        if request.method in SAFE_METHODS:
            return True

        return obj.author == request.user

     
class PostList(generics.ListAPIView):
    permission_classes = [IsAuthenticated]
    # queryset = Post.objects.all()
    serializer_class = PostSerializer

    def get_queryset(self):
        user = self.request.user
        return Post.objects.filter(author=user)


class PostDetail(generics.RetrieveAPIView, PostUserWritePermission):
    # permission_classes = [PostUserWritePermission]
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    def get_queryset(self):
        item = self.kwargs["pk"]
        print(item)
        return Post.objects.filter(slug=item)

blog_api/urls.py

from .views import PostList, PostDetail
from django.urls import path
from rest_framework.routers import DefaultRouter

app_name = 'blog_api'

# router = DefaultRouter()
# router.register('', PostList, basename='post')
# urlpatterns = router.urls

urlpatterns = [
    path('posts/<str:pk>/', PostDetail.as_view(), name='detail_create'),
    path('', PostList.as_view(), name='list_create'),
]

博客/models.py

from django.db import models
from django.conf import settings
from django.utils import timezone

# Create your models here.
class Category(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Post(models.Model):

    class PostObjects(models.Manager):
        def get_queryset(self):
            return super().get_queryset().filter(status="published")

    options = (
        ("draft", "Draft"),
        ("published", "Published"),
    )
    category = models.ForeignKey(Category, on_delete=models.PROTECT, default=1)
    title = models.CharField(max_length=250)
    excerpt = models.TextField(null=True)
    content = models.TextField()
    slug = models.SlugField(max_length=250, unique_for_date="published")
    published = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="blog_post")
    status = models.CharField(max_length=10, choices=options, default="published")

    objects = models.Manager()
    post_objects = PostObjects()

    class Meta:
        ordering = ["-published"]

    def __str__(self):
        return self.title

在您的 PostDetail class 在 blog_api/views.py 文件中,而不是覆蓋 get_queryset 方法,覆蓋 get_object 方法,像這樣

    def get_object(self, queryset=None, **kwargs):

        item = self.kwargs.get('pk')
        return get_object_or_404(Post.objects.filter(slug=item))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM