我想澄清django-rest-framework有关创建模型对象的给定文档。到目前为止,我发现有3种方法来处理此类事件。
序列化器的create()方法。这是文档
class CommentSerializer(serializers.Serializer):
def create(self, validated_data):
return Comment.objects.create(**validated_data)
ModelViewsetcreate()方法。文献资料
class AccountViewSet(viewsets.ModelViewSet):
queryset = Account.objects.all()
serializer_class = AccountSerializer
permission_classes = [IsAccountAdminOrReadOnly]
ModelViewsetperform_create()方法。文献资料
class SnippetViewSet(viewsets.ModelViewSet):
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
这三种方法很重要,具体取决于您的应用程序环境。
但是什么时候我们需要使用每个create() / perform_create()函数?另一方面,我发现有人要求为单个发布请求调用modelviewsetcreate()和serializer的两个create方法create()。
希望任何人都可以分享他们的一些知识来进行解释,这肯定会对我的开发过程有所帮助。
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进行繁重而乏味的工作的目的。希望这可以帮助!
问题内容: 我想提供两个不同的序列化器,但仍然可以从以下所有功能中受益: 当查看对象列表时,我希望每个对象都有一个重定向到其详细信息的url,并使用目标模型来显示其他所有关系。 例: 查看对象的详细信息时,我想使用默认值 例: 我设法按照以下方式完成了所有这些工作: serializers.py views.py 基本上,我会检测用户何时请求列表视图或详细视图,并进行更改以满足我的需求。不过,我对
我希望提供两种不同的序列化程序,同时又能够从的所有功能中获益: 当查看对象列表时,我希望每个对象都有一个重定向到其详细信息的url,并且使用目标模型的显示所有其他关系; 示例: 查看对象的详细信息时,我希望使用默认的 示例: 我设法通过以下方式使这一切如我所愿发挥作用: serializers.py views.py 基本上,我会检测用户何时请求列表视图或详细视图,并根据需要更改。我对这段代码并不
问题内容: 该MobX文档告诉我,我必须“使用变换插件变换装饰遗留并确保它是第一个在插件列表”,为了使装饰工作。MobX样板项目建议我需要一个类似的东西: 如何使用create-react-app生成的项目来做到这一点?任何尝试使用装饰器的错误。项目“退出”后甚至没有。 问题答案: 除非您不能使用装饰器语法。但是,您可以不使用MobX,因为它只是一个语法糖。 丹·阿布拉莫夫阐明了这一原因 我们的立
描述 (Description) 它在集合中创建模型的新实例。 语法 (Syntax) collection.create(attributes,options) 参数 (Parameters) attributes - 它们表示已定义模型的属性。 options - 它使用id,name等参数来创建集合实例。 例子 (Example) <!DOCTYPE html> <html> <he
create 通过一个构建函数完整的创建一个 Observable create 操作符将创建一个 Observable,你需要提供一个构建函数,在构建函数里面描述事件(next,error,completed)的产生过程。 通常情况下一个有限的序列,只会调用一次观察者的 onCompleted 或者 onError 方法。并且在调用它们后,不会再去调用观察者的其他方法。 演示 创建一个 [0,
create 函数签名: create(subscribe: function) 使用给定的订阅函数来创建 observable 。 示例 示例 1: 发出多个值的 observable ( StackBlitz | jsBin | jsFiddle ) // RxJS v6+ import { Observable } from 'rxjs'; /* 创建在订阅函数中发出 'Hello' 和
我正在传递-XX:-UseSplitVerifier-Xverify:命令行上无,但我仍然收到错误错误,无法加载最新版本的配置文件[角度]。正在尝试Grails发布版本(使用--stacktrace查看完整跟踪) |运行Grails CLI时出错:连接超时(使用--stacktrace查看完整跟踪)
Creates new projects from any create-* starter kits. yarn create <starter-kit-package> [<args>] This command is a shorthand that helps you do two things at once: Install create-<starter-kit-package> g