- 你会使用
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进行繁重而乏味的工作的目的。
希望这可以帮助!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)