Патч с одним полем с generics.RetrieveUpdateDestroyAPIView
У меня есть следующие модели, и я хотел достичь лучшей практики исправления данных с помощью RetrieveUpdateDestroyAPIView
.
Ниже представлены модели
class Post(TimeStampedModel, models.Model):
"""Post model."""
title = models.CharField(_('Title'), max_length=100, blank=False,
null=False)
# TODO: Add image upload.
image = models.ImageField(_('Image'), upload_to='blog_images', null=True,
max_length=900)
body = models.TextField(_('Body'), blank=False)
description = models.CharField(_('Description'), max_length=400,
blank=True, null=True)
slug = models.SlugField(default=uuid.uuid4(), unique=True, max_length=100)
owner = models.ForeignKey(User, related_name='posts',
on_delete=models.CASCADE)
class Meta:
ordering = ['created']
def __str__(self):
"""
Returns a string representation of the blog post.
"""
return f'{self.title} {self.owner}'
def save(self, *args, **kwargs):
"""Generate slug field."""
if not self.id:
date = datetime.datetime.now()
uid = uuid.uuid4()
slug_str = '{} {} {}'.format(self.title, date, uid)
self.slug = slugify(slug_str)
super(Post, self).save(*args, **kwargs)
class Tag(models.Model):
"""Tags model."""
name = models.CharField(max_length=100, blank=False, default='')
owner = models.ForeignKey(User, related_name='tags_owner',
on_delete=models.CASCADE)
posts = models.ManyToManyField(Post, related_name='tags',
blank=True)
class Meta:
verbose_name_plural = 'tags'
def __str__(self):
"""
Returns a string representation of the tags post.
"""
return f'{self.name}'
По моему мнению, это класс, который может помочь в создании патчей :
class PostDetail(generics.RetrieveUpdateDestroyAPIView):
"""Blog post details"""
queryset = Post.objects.all()
serializer_class = serializers.PostSerializer
authentication_classes = (JWTAuthentication,)
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
lookup_field = 'slug'
def patch(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data, partial=True,
context=request)
if serializer.is_valid():
serializer.save()
return response.Response(serializer.data,
status=status.HTTP_201_CREATED,)
return response.Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
Serializers
выглядит следующим образом :
class PostSerializer(serializers.ModelSerializer):
"""Post Serializer"""
owner = UserProfile(read_only=True)
tags = TagSerializer(many=True)
comments = CommentSerializer(many=True, read_only=True)
slug = serializers.SlugField(read_only=True)
class Meta:
model = Post
fields = ('id', 'title', 'body', 'owner', 'slug',
'comments', 'tags', 'description', 'image',
'created', 'modified',)
def create(self, validated_data):
"""Create a blog post in a customized way."""
tags = validated_data.pop('tags')
post = Post.objects.create(**validated_data,
owner=self.context.user)
for tag in tags:
tag_obj = Tag.objects.create(
name=tag.get('name'),
owner=self.context.user, )
post.tags.add(tag_obj)
urls.py
path('posts/<slug:slug>/', views.PostDetail.as_view()),
Итак, когда я отправляю запрос, он просто добавляет новый блог, странная ситуация. Конечная точка должна быть патчем.