何时使用Serializer的create()和ModelViewset的perform_create()

2024-02-01

我想澄清有关创建模型对象的 Django-rest-framework 给定文档。到目前为止,我发现有 3 种方法来处理此类事件。

  1. 序列化器的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)
    
  2. 模型视图集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]
    
  3. 模型视图集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().


  1. 你会使用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)
    
  2. 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)在序列化器中找到(您的特定应用程序逻辑可能驻留在其中)。

  3. 现在你可能会问,为什么我们有一个单独的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(使用前将#替换为@)

何时使用Serializer的create()和ModelViewset的perform_create() 的相关文章

随机推荐

  • 是否可以在 Kubernetes 复制控制器中设置主机名?

    我需要在 Kubernetes 复制控制器中设置静态主机名 Docker 通过一些运行时标志来支持它 但是 Kubernetes 复制控制器似乎不支持它 环境 操作系统 CentOS 6 6 使用 sysctl 更改变量 kernel ho
  • CSRF 攻击适用于 API 吗?

    我正在编写一个 Django RESTful API 来支持 iOS 应用程序 每当我编写处理 POST 请求的方法时 我都会遇到 Django 的 CSRF 保护 我的理解是 iOS 管理的 cookie 不会被应用程序共享 这意味着我的
  • 如何通过请求使用转换流?

    基本上 我想在使用转换流将http响应发送到客户端之前更改它 但是下面的代码抛出一个错误 错误 结束后写入 有关的文档http nodejs org api stream html stream writable end chunk enc
  • 提升和变量范围

    有人可以帮助解释为什么下面的两个代码片段打印出不同的结果吗 区别在于条件语句内部 第一个例子中 有一个局部变量 Jack 分配给 name 并且条件为 true 意味着 name 的计算结果为 true 在第二个例子中 相同的名称 Jack
  • ASP.NET MVC 成员角色

    我需要对 ASP NET 会员资格进行一些说明 请帮助我 我正在使用 ASP NET MCV 3 框架 并打算使用 ASP NET 成员身份通过 LDAP 或 SQL 进行用户和身份验证管理 对于我到目前为止所理解的 ASP NET 会员资
  • 将科学计数法的字符串转换为 XPath 中的数字格式

    我有这个字符串 8 1161E 002 这个字符串实际上是计算的结果 不幸的是结果被转换为字符串并且我无法更改它 那么我怎样才能将这个字符串转换为类似的格式00 081 我正在查看 XPath 参考 但找不到format 例如函数 有没有办
  • std::函数向量

    我想要一个 std vector 包含一些函数 并且可以实时向其中添加更多函数 所有的函数都会有一个这样的原型 无效名称 SDL Event 事件 我知道如何创建函数数组 但是如何创建函数的 std vector 我试过这个 std vec
  • Android:仅旋转相机预览上的覆盖按钮

    我有一个 Android 应用程序 使用 LinearLayout 作为主要布局 并使用相机预览填充 SurfaceView 在此 我用三个按钮和一个自定义 TextView 填充另一个 LinearLayout 我希望相机预览始终保持横向
  • 为什么 Process.WorkingSet > Process.MaxWorkingSet?

    闲着的好奇心 我正在查看当前进程的一些属性 using Process p Process GetCurrentProcess Inspect properties p MaxWorkingSet 1 413 120 p MinWorkin
  • 在 matplotlib 表中换行文本

    我需要使用 matplotlib 从字典列表中创建一个表 为此 我使用以下函数 我在该网站的另一个答案中找到了该函数 import matplotlib pyplot as plt from matplotlib externals imp
  • 为什么会有相互冲突的变量?

    我在 facebook javascript SDK 和 python requesthandler 变量之间得到了冲突的结果 Javascript SDK 表示我的用户未登录 这是正确的 而来自基本请求处理程序的模板变量表示我的用户已登录
  • 如何打开 .hxs 文件?

    我知道 hxs 文件是编译后的帮助文件 是 chm 文件的替代品 但我似乎无法打开它们 我读到您使用此处找到的帮助资源管理器 dexplore exe 来阅读它们 C Program Files Common Files microsoft
  • 设置自定义字体时出现文本对齐问题

    当我为分段控件设置自定义字体时 它会更改垂直文本对齐方式 我正在使用下面的代码来设置字体 I dont think these lines are creating any issue but just wanted to paste al
  • IE 11 开发人员工具问题 - window.onload 中出现异常

    I installed Internet Explorer 11 on my Windows 7 machine and it s not building the DOM in DOM Explorer Does any one know
  • 无法减少 ng-repeat 中的观察者数量

    出于性能目的 我想从我的 ng repeat 中删除双重数据绑定 因此 相关的观察者 它加载 30 个项目 并且这些数据一旦加载就是静态的 因此不需要双重数据绑定 问题是 无论我怎么做 该页面上的观看者数量都保持不变 让我们说 div no
  • 如果不在 Woocommerce 中重新加载,自定义购物车计数不会更新

    我已将 ajax 脚本排入队列 但在不刷新页面的情况下似乎无法更新购物车商品计数 功能 Add scripts and stylesheets function startwordpress scripts wp enqueue style
  • 在 Javascript 中的多个变量声明期间不熟悉方括号的使用[重复]

    这个问题在这里已经有答案了 我是 Javascript 的初学者 遇到了这种语法用法 简化 var testString firstName lastName var a b testString split 我的问题是变量 a 和 b 在
  • 静态初始化与动态初始化

    为什么在 C 中我们更喜欢静态初始化而不是动态初始化 有什么大不了的 如果静态初始化如此高效 那么为什么像 Java C 这样的新语言要使用动态初始化呢 我们不这样做 我们更喜欢自动初始化 即在堆栈 而不是堆 上创建对象 如果我们这样做 他
  • 如何将所有 UIButton 字体更改为自定义字体?

    有什么办法可以做到这一点吗 我想要下载一个自定义字体以显示在 UIButton 上 如果你使用IBOutletCollection那么这应该是直接的 property nonatomic retain IBOutletCollection
  • 何时使用Serializer的create()和ModelViewset的perform_create()

    我想澄清有关创建模型对象的 Django rest framework 给定文档 到目前为止 我发现有 3 种方法来处理此类事件 序列化器的create 方法 这里是文档 http www django rest framework org