首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么不从视图中调用自定义序列化程序的save()方法?

在视图中调用自定义序列化程序的save()方法可能会导致一些问题和不良影响。以下是一些原因:

  1. 视图的职责:视图主要负责处理请求和响应,以及协调其他组件的工作。调用自定义序列化程序的save()方法会将数据持久化的责任交给视图,这违反了单一职责原则。视图应该专注于处理请求和响应,而将数据持久化的任务交给适当的组件,如模型。
  2. 代码复用和可维护性:将数据持久化的逻辑放在视图中可能导致代码重复和可维护性下降。如果多个视图需要保存相同的数据,每个视图都要实现相同的保存逻辑,这样会增加代码冗余并降低代码的可维护性。相反,将数据持久化的逻辑封装在自定义序列化程序的save()方法中,可以在多个视图中重复使用,并且更容易进行维护和修改。
  3. 数据验证和处理:自定义序列化程序的save()方法通常会包含数据验证和处理的逻辑,例如检查字段的有效性、处理关联关系等。将这些逻辑放在视图中可能会导致数据验证和处理的分散和混乱。相反,将这些逻辑封装在自定义序列化程序的save()方法中,可以更好地组织和管理数据验证和处理的逻辑。

综上所述,从视图中调用自定义序列化程序的save()方法可能会导致职责混乱、代码重复和可维护性下降等问题。更好的做法是将数据持久化的责任交给适当的组件,如模型,而将视图专注于处理请求和响应。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Django REST Framework-自定义序列化

在这种情况下,我们可以使用自定义序列化器。自定义序列化器可以让我们创建一个完全定制序列化器,以满足我们需求。我们可以定义自己字段和验证逻辑,并在需要时覆盖默认实现。...我们还覆盖了create()和update()方法,以处理序列化和反序列化逻辑。...我们可以使用以下代码在Django视图中使用自定义序列化器:from rest_framework import genericsfrom .serializers import BookSerializerfrom...()在上面的代码中,我们使用自定义序列化器BookSerializer,并在视图中定义了perform_create()方法,以保存反序列化数据。...除了自定义字段和序列化逻辑之外,我们还可以使用自定义序列化器实现复杂验证逻辑和字段级别的权限控制。

35030

RESTframework_一

特点: 提供了定义序列化器Serializer方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化; 提供丰富类视图,Mixin扩展类,简化视图编写 丰富定制层级:函数视图...: '乔峰', 'gender': True, 'comment': '降龙十八掌', 'book_id': 2, 'book': 'http://127.0.0.1:8000/hero/2'} 视图中序列化器添加...自定义输出方案 class BookRelateField(serializers.RelatedField): '''自定义处理图书字段''' def to_representation(self...验证 字段类型 必填验证 定义方法 多属性验证 定义类型 保存 #增加:BookInfoSerializer(data=json)==>save() #修改:BookInfoSerializer...(book,data=json)==>save() 调用save() 要在序列化器中定义 create()或者update() def create(self, validated_data

70420

django 1.8 官方文档翻译: 13-9-1 如何使用会话

django.contrib.auth.login() 调用这个方法来减缓会话固定。 会话序列化 在1.6 版以前,在保存会话数据到后端之前Django 默认使用pickle 来序列化它们。...为了帮助这个功能,Django 1.5.3 引入一个新设置,SESSION_SERIALIZER,来自定义会话序列化格式。...绑定序列化方法 class serializers.JSONSerializer 对 django.core.signing中JSON 序列化方法一个包装。只可以序列基本数据类型。...你序列化类必须实现两个方法,dumps(self, obj) 和loads(self, data) 来分别序列化和去序列化会话数据字典。...只需在一个视图中调用request.sessionset_test_cookie()方法,并在接下来图中调用test_cookie_worked() —— 不是在同一个视图中调用

1.2K20

day91-day92-DjangoRestFrameWork序列化&反序列化使用

=True 只序列化用 -- write_only=True 只反序列化用 2.2.7 可以自定义字段名,自定义字段一般只用于反序列化 2.2.8 创建数据要重写 create...() 方法,更新数据要重写 update() 方法,函数里面是ORM操作 2.2.9 -- 可自定义校验函数 my_validate(),权重最高,第一个校验,校验函数可以是多个,...+ serializers.SerializerMethodField() 方法字段使用,一般自定义参数展示指定 read_only=True 3.3 get_XXX 自定义字段名称,该函数返回值会返回给该自定义字段...中定义list_serializer_class class BookSerializer(serializers.ModelSerializer): # 指定方法字段,可以对字段进行自定义重写...代表是对象模型列表, validated_data 是数据列表 # child 代表每一个更新对象 # child 调用 update

98350

PHP会话(Session)实现用户登陆功能

如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余负担。因为我们并不能 只做一次验证。为什么呢?因为客户端 Cookie 中信息是有可能被修改。...> 同 session_set_cookie_params(); 函数一样,session_save_path() 函数也必须在 session_start() 函数调用之前调用。...> 当我们执行 setage.php 文件时候,调用了 setage() 方法,设置了年龄为 21,并将该状态序列化后保存在 Session 中(PHP 将自动完成这一转换),当转到 output.php...值为 21,然后调用 output() 方法输出该值。...另外,我们还可以使用 session_set_save_handler 函数来自定义 Session 调用方式。

2.3K20

【愚公系列】2022年04月 Python教学课程 67-DRF框架之GenericAPIView

queryset:应用于从此视图返回对象查询集。通常,必须设置此属性或重写该方法。如果要重写视图方法,请务必调用而不是直接访问此属性,因为将评估一次,并且这些结果将缓存用于所有后续请求。...serializer_class:应用于验证和反序列化输入以及序列化输出序列化程序类。通常,必须设置此属性或重写该方法。 lookup_field:应用于执行各个模型实例对象查找模型字段。...请注意,使用超链接 API时,如果需要使用自定义值,则需要确保 API 视图和序列化程序类都设置了查找字段。 lookup_url_kwarg:应用于对象查找 URL 关键字参数。...data方法获取序列化结果 data = ser.data # 3、返回所有对象字段内容 return Response({'book_list':...raise_exception=True) # raise_exception=True 验证失败直接返回 # ser.errors获取验证结果信息 # 3、保存图书 # 调用序列化器中封装保存方法

35720

php 反序列漏洞初识

我觉得学习时候,所有的问题都应该问 3 个问题:what、why、how: what:什么是反序列化,why:为什么会出现反序列化漏洞,how:反序列化漏洞如何利用。...然后实例化这个类并调用方法。运行结果如下。 ? 当然,上面的代码是正常情况下调用。...为什么要有序列化这种机制呢?在传递变量过程中,有可能遇到变量值要跨脚本文件传递过程。...这就是所谓 POP。就是关注整个函数调用过程中参数传递情况,找到可利用点,这和一般 Web 漏洞没什么区别,只是可控制值有直接传递给程序参数转变为了对象中属性值。...2.利用普通成员方法 在反序列化时候,当漏洞/危险代码存在类普通方法中,就不能指望通过“自动调用”来达到目的了。这时利用方法如下,寻找相同函数名,把敏感函数和类联系在一起。 <?

1.1K00

Redis专题(十)——Redis存储Session

session_set_save_handler方法实质上不仅实现存储位置由文件变为redis(或其他用户定义存储类型如memcache),还需要自定义session被打开、关闭、设置、读取、销毁、回收等情况下...因此,该方法传入变量全是回掉函数。...该方法具体内容,在php官方文档中,定义如下: boolsession_set_save_handler ( callable $open , callable $close , callable $...类似于类构造函数。 2、close 当session关闭时调用函数,类似于析构函数。 3、read 如果会话中有数据,read 回调函数必须返回将会话数据编码(序列化)后字符串。...其中,存储在session内容如果是数组、对象,必须序列化后存储,而session调用此函数后会自动将值进行反序列化

1.3K50

DRF比Django认证和权限高在哪里

同时重写save方法,在同步数据库时候,使用pygments包把code格式化后存到highlighted字段。...因为前面只给Snippet添加了owner字段,还没有写反序列化更新模型代码,所以通过请求访问视图,再尝试反序列化时候,报错了。...) 在SnippetList视图中重写perform_create()方法,意思是在保存时,把request.user值赋给owner字段。...这个报错是发生这条代码: serializer.save(owner=self.request.user) 也就是说请求访问视图后,进行反序列化了,但是反序列化失败了。非常奇怪!...我们请求中并没有用户信息,正常来说在访问视图时候就该被拦截了。 给视图添加认证 我们需要让API更符合常规,让未认证用户不能执行视图中代码。

1.5K20

19.7 Boost Asio 传输序列化数据

序列化期间,对象状态被编码为一组字节,并可以保存或传输到另一个位置。序列化字节可以在之后进行反序列化,以将对象重建为在序列化之前状态。 反序列化则是将字节序列重新转换为对象或数据结构过程。...首先来看服务端代码,在代码中我们定义一个自定义MyDate结构体,该结构体内包含了一个serialize该函数适用于序列化与反序列化时使用,当我们调用struct_load函数时,就会触发这个序列化方法...std::system("pause"); return 0; } 接着我们来分析一下客户端代码实现,对于客户端而言我们同样需要定义一个完全一致MyDate结构体,当调用struct_save...函数时则会将传入结构体参数序列化为一个字符串,此时通过调用write_some即可将压缩后结构体传输给服务端。...), error_code); std::system("pause"); return 0; } 读者可自行编译运行这段代码片段,当两个程序运行时则会实现结构体远程传输功能,如下图所示;

16140

drf框架序列化和返序列化

,put,deleter 其中用到序列化get 用到反序列化剩下四中 二.序列化使用 1.首先我们要根据我们定义模型一一对应定义一个继承serializers.Serializer类 class...model类属性相同 只出现在序列化中不出现在反序列化中我们要加只读属性read_only=True 如果我们Serializer类中定义字段类型为SerializerMethodField及自定义字段类型不用遵守类里面的字段必须在...model类中必须存在该字段 不需要序列化字段 不需要序列化属性字段在序列化类中不需要声明 不需要序列化属性字段在序列化类中设置只写属性write_only=True 2.在views视图中 from...# validated_data校验通过后新数据 # instance值外部反序列化传入要更新自定义标识决定 instance.update(**validated_data...返回值是由update内部自定义返回值决定 user_obj = user_ser.save() return APIResponse(0, 'ok'

86651

19.7 Boost Asio 传输序列化数据

序列化期间,对象状态被编码为一组字节,并可以保存或传输到另一个位置。序列化字节可以在之后进行反序列化,以将对象重建为在序列化之前状态。反序列化则是将字节序列重新转换为对象或数据结构过程。...首先来看服务端代码,在代码中我们定义一个自定义MyDate结构体,该结构体内包含了一个serialize该函数适用于序列化与反序列化时使用,当我们调用struct_load函数时,就会触发这个序列化方法...::system("pause"); return 0;}接着我们来分析一下客户端代码实现,对于客户端而言我们同样需要定义一个完全一致MyDate结构体,当调用struct_save函数时则会将传入结构体参数序列化为一个字符串...,此时通过调用write_some即可将压缩后结构体传输给服务端。...); std::system("pause"); return 0;}读者可自行编译运行这段代码片段,当两个程序运行时则会实现结构体远程传输功能,如下图所示;

16431

挑战10个最难回答Java面试题(附答案)

Java 程序员可自由选择基于类结构标准序列化或是他们自定义二进制格式, 通常认为后者才是最佳实践, 因为序列化二进制文件格式成为类输出 API一部分, 可能破坏 Java 中私有和包可见属性封装...如果在类中定义这两种方法, 则 JVM 将调用这两种方法, 而不是应用默认序列化机制。你可以在此处通过执行任何类型预处理或后处理任务来自定义对象序列化和反序列化行为。...在我看来, 这是在任何 Java 序列化面试中可以问最好问题之一, 一个很好后续问题是, 为什么要为你对象提供自定义序列化表单?...最近这个问题在Java面试中被问到我一位朋友,他思索了一下,并回答说: 如果我们不从同步上下文中调用 wait() 或 notify() 方法,我们将在 Java 中收到 IllegalMonitorStateException...为什么要等待来自 Java中 synchronized 方法 wait方法为什么必须从 Java 中 synchronized 块或方法调用

1.4K40

Java 大牛看过来,挑战10道超难 Java 面试题!

Java 程序员可自由选择基于类结构标准序列化或是他们自定义二进制格式, 通常认为后者才是最佳实践, 因为序列化二进制文件格式成为类输出 API一部分, 可能破坏 Java 中私有和包可见属性封装...如果在类中定义这两种方法, 则 JVM 将调用这两种方法, 而不是应用默认序列化机制。你可以在此处通过执行任何类型预处理或后处理任务来自定义对象序列化和反序列化行为。...在我看来, 这是在任何 Java 序列化面试中可以问最好问题之一, 一个很好后续问题是, 为什么要为你对象提供自定义序列化表单?..., 为什么在 Java 中 wait, notify 和 notifyAll 来自 synchronized 块或方法最近这个问题在Java面试中被问到我一位朋友,他思索了一下,并回答说: 如果我们不从同步上下文中调用...为什么要等待来自 Java中 synchronized 方法 wait方法为什么必须从 Java 中 synchronized 块或方法调用

70731

挑战 10 道超难 Java 面试题

Java 程序员可自由选择基于类结构标准序列化或是他们自定义二进制格式, 通常认为后者才是最佳实践, 因为序列化二进制文件格式成为类输出 API一部分, 可能破坏 Java 中私有和包可见属性封装...如果在类中定义这两种方法, 则 JVM 将调用这两种方法, 而不是应用默认序列化机制。你可以在此处通过执行任何类型预处理或后处理任务来自定义对象序列化和反序列化行为。...在我看来, 这是在任何 Java 序列化面试中可以问最好问题之一, 一个很好后续问题是, 为什么要为你对象提供自定义序列化表单?...最近这个问题在Java面试中被问到我一位朋友,他思索了一下,并回答说: 如果我们不从同步上下文中调用 wait() 或 notify() 方法,我们将在 Java 中收到 IllegalMonitorStateException...为什么要等待来自 Java中 synchronized 方法 wait方法为什么必须从 Java 中 synchronized 块或方法调用

71920
领券