Фильтр для slug, title не работает в 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'),
]
blog/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