如果我们仔细观察,我们有两个 CURD 操作都可以在 viewset 中进行
根据文档中的示例
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 操作在视图集中处理。这是一句话的回答。
在您提供的代码中:
类 CommentSerializer(serializers.Serializer):
由于这是一个普通的序列化程序,因此您必须在此处编写 create 和 update 方法。您可以使用 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 操作。这就是我们使用 ModelViewSet 的原因。
如果您需要在创建或更新期间执行额外操作,您可以简单地覆盖序列化程序中的create() 和 update()方法。
这是我们在序列化程序中编写 CRUD 的时候——做额外的动作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句