我们应该在哪里编写我们的 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 的时候 - 以执行额外的操作。
仔细观察的话,我们在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 的时候 - 以执行额外的操作。