class SEOOptimizationView(generics.RetrieveUpdateAPIView):
"""
View for managing SEO optimization of blog posts.
Allows retrieval and updating of meta tags, descriptions, and slugs.
"""
queryset = BlogPost.objects.all()
serializer_class = SEOSerializer
lookup_field = 'slug'
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
authentication_classes = [AdminJWTAuthentication]
def get_object(self):
blog_post = super().get_object()
if not hasattr(blog_post, 'seo'):
SEO.objects.create(blog_post=blog_post)
return blog_post.seo
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
if 'slug' in request.data:
del request.data['slug']
self.perform_update(serializer)
return Response(serializer.data)