Python DRF:正确使用序列化程序和视图集的理论方法

Python DRF:正确使用序列化程序和视图集的理论方法,python,python-3.x,django,rest,django-rest-framework,Python,Python 3.x,Django,Rest,Django Rest Framework,我喜欢Python和Django,在过去的几周里我一直在学习Django REST框架,因为在2020年的今天,REST是无法逃避的。 在我的hobbie项目中(这是一个Python论坛,因为它是一个Python聚会,所以被戏称为Pyrty),我决定为评论应用程序制作一个CRUD。我做到了(除了更新),但我不知道将代码放入序列化程序和/或视图集中有什么区别 我的create和list在序列化程序中,而delete在视图集中。所有这些都按预期工作,但我不想编写脏代码,我希望了解将某些内容放在某个部

我喜欢Python和Django,在过去的几周里我一直在学习Django REST框架,因为在2020年的今天,REST是无法逃避的。 在我的hobbie项目中(这是一个Python论坛,因为它是一个Python聚会,所以被戏称为Pyrty),我决定为
评论
应用程序制作一个CRUD。我做到了(除了更新),但我不知道将代码放入序列化程序和/或视图集中有什么区别

我的
create
list
在序列化程序中,而
delete
在视图集中。所有这些都按预期工作,但我不想编写脏代码,我希望了解将某些内容放在某个部分或另一部分的要点和区别

comments.models.py:

class Comment(PyrtyModel): # the inheritance class just adds creation and modification dates, and sorting stuff

    user = models.ForeignKey('users.User', on_delete=models.CASCADE, null=False)
    post = models.ForeignKey('posts.Post', on_delete=models.CASCADE, null=False)

    content = models.TextField(max_length=1000, null=False, blank=False)

    positive_votes = models.ManyToManyField('users.User', related_name='c_positive_vote_set')
    negative_votes = models.ManyToManyField('users.User', related_name='c_negative_vote_set')

    score = 0

    def __init__(self, *args, **kwargs):
        # init with the score (positive votes - negative votes) if the comment is persisted
        super(Comment, self).__init__(*args, **kwargs)
        if self.id is not None:
            self.score = (
                self.positive_votes.all().count() -
                self.negative_votes.all().count()
            )

    def __str__(self):
        """Return the comment str."""
        return "'{}'".format(self.content)

    class Meta(PyrtyModel.Meta):
        ordering = ['created', 'modified']
comments.serializers.py:

class CommentSerializer(serializers.ModelSerializer):
    """Comment model serializer."""

    user = serializers.PrimaryKeyRelatedField(read_only=True)

    class Meta:
        model = Comment
        fields = '__all__'

    def create(self, validated_data):
        """Create a new comment in some post, by request.user."""

        validated_data['user'] = self.context['request'].user
        return super().create(validated_data)

    def list(self, request):
        """List all the comments from some post."""

        if 'post' not in request.query_params:
            raise ValidationError('Post id must be provided.')

        q = self.queryset.filter(post=request.query_params['post'])
        serializer = CommentSerializer(q, many=True)
        return Response(serializer.data)
comments.views.py:

class CommentViewSet(viewsets.ModelViewSet):

    serializer_class = CommentSerializer
    queryset = Comment.objects.all()

    def get_permissions(self):
        permissions = []
        if self.action == 'create' or self.action == 'destroy':
            permissions.append(IsAuthenticated)
        return [p() for p in permissions]

    def get_object(self):
        """Return comment by primary key."""
        return get_object_or_404(Comment, id=self.kwargs['pk'])

    def destroy(self, request, *args, **kwargs):
        """Delete a comment created by request.user from a post."""

        instance = self.get_object()
        if instance.user != request.user:
            raise ValidationError('Comment does not belong to the authenticated user.')
        self.perform_destroy(instance)
        run_reputation_update(request.user)
        return Response(status=status.HTTP_204_NO_CONTENT)

    def retrieve(self, request, pk=None):
        pass

    def update(self, request, pk=None):
        pass

    def partial_update(self, request, pk=None):
        pass

我应该在何时何地将代码放在一个部分或另一个部分?

序列化程序用于验证请求数据(传入参数)并格式化(序列化)要发送回响应的数据

此外,序列化程序具有类似于
创建
更新
保存
的方法,在这些方法中,您可以定义应如何保存已验证数据的逻辑。尤其是对于模型序列化程序来说,这非常方便

所有其他逻辑都应在视图/视图集中定义

我很确定
CommentSerializer
中的
list
方法没有任何作用。因为序列化程序没有
list
方法,您在那里定义了它,但从未使用过<另一方面,code>ModelViewSet有
list
方法,我很确定这是获取注释列表时使用的方法,而不是序列化程序中的
list
方法