问题:何时使用序列化器的create()和ModelViewset的create()perform_create()
我想澄清django-rest-framework
有关创建模型对象的给定文档。到目前为止,我发现有3种方法来处理此类事件。
序列化器的
create()
方法。这是文档class CommentSerializer(serializers.Serializer): def create(self, validated_data): return Comment.objects.create(**validated_data)
ModelViewset
create()
方法。文献资料class AccountViewSet(viewsets.ModelViewSet): queryset = Account.objects.all() serializer_class = AccountSerializer permission_classes = [IsAccountAdminOrReadOnly]
ModelViewset
perform_create()
方法。文献资料class SnippetViewSet(viewsets.ModelViewSet): def perform_create(self, serializer): serializer.save(owner=self.request.user)
这三种方法很重要,具体取决于您的应用程序环境。
但是什么时候我们需要使用每个create() / perform_create()
函数?另一方面,我发现有人要求为单个发布请求调用modelviewsetcreate()
和serializer的两个create方法create()
。
希望任何人都可以分享他们的一些知识来进行解释,这肯定会对我的开发过程有所帮助。
回答 0
- 你会使用
create(self, validated_data)
节约型和“刺”的价值观为就像每个模型前场添加任何额外的细节到对象**validated_data
一样。理想情况下,您只想在一个位置执行这种“探测”形式,因此create
您的方法CommentSerializer
是最佳的选择。最重要的是,您可能还想调用外部api,以在将帐户保存到自己的数据库之前在其旁边创建用户帐户。您应该将此create
功能与结合使用ModelViewSet
。永远想一想-“薄视图,厚串行器”。
例:
def create(self, validated_data):
email = validated_data.get("email", None)
validated.pop("email")
# Now you have a clean valid email string
# You might want to call an external API or modify another table
# (eg. keep track of number of accounts registered.) or even
# make changes to the email format.
# Once you are done, create the instance with the validated data
return models.YourModel.objects.create(email=email, **validated_data)
中的
create(self, request, *args, **kwargs)
函数在的父类中ModelViewSet
定义。的主要功能如下:CreateModelMixin
ModelViewSet
CreateModelMixin
from rest_framework import status from rest_framework.response import Response def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) def perform_create(self, serializer): serializer.save()
如您所见,以上create
函数负责在序列化程序上调用验证并产生正确的响应。这样做的好处是,您现在可以隔离应用程序逻辑,而不必担心平凡和重复的验证调用以及处理响应输出:)。与create(self, validated_data)
序列化器(您的特定应用程序逻辑所在的位置)中的结合使用时,这可以很好地工作。
- 现在您可能会问,为什么我们
perform_create(self, serializer)
只有一行代码才有一个单独的函数!好吧,这背后的主要原因是在调用save
函数时允许自定义。您可能想要在调用之前提供额外的数据save
(例如serializer.save(owner=self.request.user)
,如果我们没有perform_create(self, serializer)
,那么您将不得不重写,create(self, request, *args, **kwargs)
而这违背了让mixin进行繁重而乏味的工作的目的。
希望这可以帮助!