我们应该在modelviewset或viewset或django-rest框架中的Serializer中的哪里编写CUR



如果我们仔细观察,我们有两个CURD操作都可以在视图集中执行

根据文件中的示例

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的时候——执行额外的操作。

相关内容

  • 没有找到相关文章