我们应该在哪里编写我们的 CRUD 操作在模型视图或视图集中或在 django rest 框架中的序列化程序中

where should we write our CURD Operation in modelviewset or viewsets or in Serializer in django rest framework

仔细观察的话,我们在viewset中既可以进行CURD操作

根据 docs

中的示例
class UserViewSet(viewsets.ViewSet):
    """
    Example empty viewset demonstrating the standard
    actions that will be handled by a router class.

    If you're using format suffixes, make sure to also include
    the `format=None` keyword argument for each action.
    """

    def list(self, request):
        pass

    def create(self, request):
        pass

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

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

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

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

这是序列化程序示例

class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

    def create(self, validated_data):
        return Comment(**validated_data)

    def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.content = validated_data.get('content', instance.content)
        instance.created = validated_data.get('created', instance.created)
        return instance

假设我们可以获得经过验证的数据,就跳过那个,问题是我应该在哪里执行CRUD操作,使用每个操作的权衡是什么。什么是最佳实践,为什么采用这种方法,这对很多人都有很好的帮助。

这取决于我们的要求。

CRUD 操作在视图集中处理。这是一句话回答。

在您提供的代码中:

class CommentSerializer(serializers.Serializer):

因为这是一个普通的序列化程序,所以你必须在这里编写创建和更新方法。 您可以使用 ModelSerializer,这样您就无需为创建和更新编写定义。像这样。

Class CommentSerializer(serializer.ModelSerializer):
      class Meta:
          fields = '__all__'
          model = Comment 

然后您可以使用 ModelViewSet 编写视图集,它为您提供所有 CRUD 操作的默认实现。

Class CommentViewSet(viewset.ModelViewSet):
      serializer_class = CommentSerializer
      queryset         = Comment.objects.all()

现在 CommentViewSet 可以让您完成所有的 CRUD operations.thats 我们使用 ModelViewSet 的原因。

如果您需要在创建或更新期间执行额外的操作,您可以简单地覆盖序列化程序中的 create() 和 update() 方法。
这是我们在序列化程序中编写 CRUD 的时候 - 以执行额外的操作。