Патч с одним полем с 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()),

Итак, когда я отправляю запрос, он просто добавляет новый блог, странная ситуация. Конечная точка должна быть патчем.

Вернуться на верх