Django rest framework browsable api показывает null для поля manytomany
Я собираюсь реализовать api для приложения блога, используя DRF ModelViewSet:
.
Вот как я реализовал:
views.py
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from rest_framework.response import Response
from .serializers import PostSerializer, CategorySerializer
from ...models import Post, Category
from rest_framework import viewsets
from rest_framework.decorators import action
from .permissions import IsOwnerOrReadOnly
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from .paginations import DefaultPagination
class PostModelViewSet(viewsets.ModelViewSet):
permission_classes = [IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
serializer_class = PostSerializer
queryset = Post.objects.filter(ok_to_publish=True)
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_fields = {
"category": ["exact", "in"],
"author": ["exact"],
"ok_to_publish": ["exact"],
}
search_fields = ["title", "content"]
ordering_fields = ["publish_date"]
pagination_class = DefaultPagination
@action(detail=False, methods=["get"])
def get_ok(self, request):
return Response({"detail": "ok"})
class CategoryModelViewSet(viewsets.ModelViewSet):
permission_classes = [IsAuthenticatedOrReadOnly]
serializer_class = CategorySerializer
queryset = Category.objects.all()
serializers.py
from rest_framework import serializers
from ...models import Post, Category
from accounts.models import Profile
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ["id", "name"]
class PostSerializer(serializers.ModelSerializer):
summary = serializers.CharField(source="get_summary", read_only=True)
relative_url = serializers.CharField(source="get_relative_api_url", read_only=True)
absolute_url = serializers.SerializerMethodField(method_name="get_absolute_api_url")
category = serializers.SlugRelatedField(
queryset=Category.objects.all(), slug_field="name", many=True
)
class Meta:
model = Post
fields = [
"id",
"title",
"author",
"image",
"content",
"summary",
"category",
"relative_url",
"absolute_url",
"ok_to_publish",
"login_required",
"n_views",
"created_at",
"publish_date",
]
read_only_fields = ["author"]
def get_absolute_api_url(self, obj): # It is not a standard and correct method
request = self.context.get("request")
return request.build_absolute_uri(obj.pk)
def to_representation(self, instance):
request = self.context.get("request")
representation = super().to_representation(instance)
if request.parser_context.get("kwargs").get("pk"):
representation.pop("summary", None)
representation.pop("relative_url", None)
representation.pop("absolute_url", None)
else:
representation.pop("content", None)
representation["category"] = CategorySerializer(
instance.category, context={"request": request}
).data
return representation
def create(self, validated_data):
validated_data["author"] = Profile.objects.get(
user__id=self.context.get("request").user.id
)
return super().create(validated_data)
но значения полей категорий равны null, а также пагинация не работает и я получил ошибку ниже:
AttributeError at /blog/api/v1/post/
У объекта 'list' нет атрибута 'split'
Метод запроса: GET URL запроса: http://127.0.0.1:8000/blog/api/v1/post/?page=2 Версия Django: 3.2.16 Тип исключения: AttributeError Значение исключения:
у объекта 'list' нет атрибута 'split'
Exception Location: /usr/local/lib/python3.9/site-packages/django_filters/widgets.py, строка 208, in value_from_datadict