我想澄清有关创建模型对象的 Django-rest-framework 给定文档。到目前为止,我发现有 3 种方法来处理此类事件。
-
序列化器的create()
方法。这里是文档 http://www.django-rest-framework.org/api-guide/serializers/#saving-instances
class CommentSerializer(serializers.Serializer):
def create(self, validated_data):
return Comment.objects.create(**validated_data)
-
模型视图集create()
方法。文档 http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset
class AccountViewSet(viewsets.ModelViewSet):
queryset = Account.objects.all()
serializer_class = AccountSerializer
permission_classes = [IsAccountAdminOrReadOnly]
-
模型视图集perform_create()
方法。文档 http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/#refactoring-to-use-viewsets
class SnippetViewSet(viewsets.ModelViewSet):
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
这三种方法的重要性取决于您的应用程序环境。
但是我们什么时候需要使用每个create() / perform_create()
功能?另一方面,我发现一些帐户为单个发布请求调用了两个创建方法ModelViewSet
's create()
和序列化器的create()
.
-
你会使用create(self, validated_data)
在将“prod”值保存到每个模型字段之前,将任何额外的详细信息添加到对象中,就像**validated_data
做。理想情况下,您只想在一个位置进行这种形式的“刺激”,这样create
方法在你的CommentSerializer
是最好的地方。除此之外,您可能还想在将帐户保存到自己的数据库之前调用外部 api 在他们这边创建用户帐户。你应该使用这个create
功能与ModelViewSet
。始终思考 - “薄视图,厚序列化器”。
Example:
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)
-
The 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
(like serializer.save(owner=self.request.user)
如果我们没有perform_create(self, serializer)
,你必须重写create(self, request, *args, **kwargs)
这恰恰违背了让 mixin 完成繁重而无聊的工作的目的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)