Different serializers for channel Get & Post

This commit is contained in:
Corban-Lee Jones 2024-02-13 11:28:26 +00:00
parent 93b3b1ace3
commit 9c106a5466
2 changed files with 35 additions and 6 deletions

View File

@ -117,13 +117,26 @@ class SubscriptionSerializer(DynamicModelSerializer):
fields = ("uuid", "name", "rss_url", "image", "server", "creation_datetime") fields = ("uuid", "name", "rss_url", "image", "server", "creation_datetime")
class SubscriptionChannelSerializer(DynamicModelSerializer): class SubscriptionChannelSerializerGET(DynamicModelSerializer):
""" """
Serializer for the SubscriptionChannel Model. Serializer for the SubscriptionChannel Model.
This serializer should be used with GET requests.
""" """
# subscription = serializers.PrimaryKeyRelatedField(queryset=Subscription.objects.all()) subscription = SubscriptionSerializer()
subscription = SubscriptionSerializer(read_only=True)
class Meta:
model = SubscriptionChannel
fields = ("uuid", "id", "subscription", "creation_datetime")
class SubscriptionChannelSerializerPOST(DynamicModelSerializer):
"""
Serializer for the SubscriptionChannel Model.
This serializer should be used with POST requests.
"""
subscription = serializers.PrimaryKeyRelatedField(queryset=Subscription.objects.all())
class Meta: class Meta:
model = SubscriptionChannel model = SubscriptionChannel

View File

@ -11,7 +11,12 @@ from rest_framework.authentication import SessionAuthentication, TokenAuthentica
from rest_framework.parsers import MultiPartParser, FormParser from rest_framework.parsers import MultiPartParser, FormParser
from apps.home.models import Subscription, SubscriptionChannel, TrackedContent from apps.home.models import Subscription, SubscriptionChannel, TrackedContent
from .serializers import SubscriptionSerializer, SubscriptionChannelSerializer, TrackedContentSerializer from .serializers import (
SubscriptionSerializer,
SubscriptionChannelSerializerGET,
SubscriptionChannelSerializerPOST,
TrackedContentSerializer
)
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -95,13 +100,19 @@ class SubscriptionChannel_ListView(generics.ListCreateAPIView):
permission_classes = [permissions.IsAuthenticated] permission_classes = [permissions.IsAuthenticated]
pagination_class = DefaultPagination pagination_class = DefaultPagination
serializer_class = SubscriptionChannelSerializer # serializer_class = SubscriptionChannelSerializer
queryset = SubscriptionChannel.objects.all().order_by("-creation_datetime") queryset = SubscriptionChannel.objects.all().order_by("-creation_datetime")
filter_backends = [rest_filters.DjangoFilterBackend, filters.OrderingFilter] filter_backends = [rest_filters.DjangoFilterBackend, filters.OrderingFilter]
filterset_fields = ["uuid", "id", "subscription", "subscription__server"] filterset_fields = ["uuid", "id", "subscription", "subscription__server"]
ordering_fields = ["creation_datetime"] ordering_fields = ["creation_datetime"]
def get_serializer(self, *args, **kwargs):
if self.request.method == "POST":
return SubscriptionChannelSerializerPOST(*args, **kwargs)
else:
return SubscriptionChannelSerializerGET(*args, **kwargs)
def post(self, request): def post(self, request):
serializer = self.get_serializer(data=request.data) serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
@ -116,6 +127,11 @@ class SubscriptionChannel_ListView(generics.ListCreateAPIView):
exception=True exception=True
) )
# Switch to the GET serializer for return data, as it contains more data on the subscription.
# We can't modify the POST serializer to contain this data, otherwise it expects it in POST.
self.request.method = "GET"
serializer = self.get_serializer(serializer.instance)
headers = self.get_success_headers(serializer.data) headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
@ -131,7 +147,7 @@ class SubscriptionChannel_DetailView(generics.RetrieveDestroyAPIView):
permission_classes = [permissions.IsAuthenticated] permission_classes = [permissions.IsAuthenticated]
parser_classes = [MultiPartParser, FormParser] parser_classes = [MultiPartParser, FormParser]
serializer_class = SubscriptionChannelSerializer serializer_class = SubscriptionChannelSerializerGET
queryset = SubscriptionChannel.objects.all().order_by("-creation_datetime") queryset = SubscriptionChannel.objects.all().order_by("-creation_datetime")
def post(self, request): def post(self, request):