最好的手机网站建设,七彩建设发展有限公司官方网站,网站 空间转移,房地产app开发方案【django framework】ModelSerializerGenericAPIView#xff0c;如何在提交前修改某些字段值 我们经常会遇到下面这种情况#xff1a; 序列化器用的是ModelSerializer#xff0c;写视图的时候继承的是generics.CreateAPIView。现在我想在正式提交到数据库(perform_create)之…【django framework】ModelSerializerGenericAPIView如何在提交前修改某些字段值 我们经常会遇到下面这种情况 序列化器用的是ModelSerializer写视图的时候继承的是generics.CreateAPIView。现在我想在正式提交到数据库(perform_create)之前修改几个字段的值应该怎么去做呢 目录 【django framework】ModelSerializerGenericAPIView如何在提交前修改某些字段值1 在Serializer序列化器中重写create2 继承generics.CreateAPIView后重写perform_create() 1 在Serializer序列化器中重写create 我们知道序列化器承担了部分视图的作用但是它主要的作用有两个 ① 对序列化进来的数据进行校验比如validate一下手机号格式是不是正确 ② 写入一些默认或者不需要前端传递的字段 // 如果说执意要在Serializer中写业务逻辑也可以。只不过这种写法会和rest_framework的设计理念相违背增加了序列化器和视图的耦合性。 from rest_framework import serializers
from .models import *
import reclass YourModelSerializer(serializers.ModelSerializer):YourModel 创建 序列化器class Meta:model YourModelfields __all__def validate(self, kwargs):校验校验前端传过来的用户手机号格式对不对MOBILE kwargs.get(mobile).mobileREGEX_MOBILE 1[3475698]\d{9}$|^147\d{8}$|^176\d{8}|^198\d{8}$# 客户手机号格式if not re.match(REGEX_MOBILE, MOBILE):raise serializers.ValidationError(客户手机号格式有误)return kwargsdef create(self, validated_data):重写create方法// 添加唯一序列号序列号不需要前端传递# 唯一序列号validated_data[serial] serial102356478# 可以在此写业务逻辑但是并不推荐return super().create(validated_data)2 继承generics.CreateAPIView后重写perform_create() 秉承着谁的活由谁来干的原则第一种方法虽然可行但是增加了序列化器与视图之间的耦合性所以并不是一个好方法。 所以我们通过重写perform_create()方法来修改我们想要修改的字段。 而视图本就是写业务逻辑的这也符合rest_framework设计初衷。 from rest_framework import generics
from .models import YourModel
from .serializers import YourModelSerializerclass YourModelCreateAPIView(generics.CreateAPIView):queryset YourModel.objects.all()serializer_class YourModelSerializerdef perform_create(self, serializer):# 获取需要修改的字段的值some_field_value serializer.validated_data.get(field_name)# 修改字段的值modified_field_value some_field_value _modified# 更新字段的值serializer.validated_data[some_field] modified_field_value# 继续调用serializer的save方法保存对象serializer.save()如此即完成了功能又不破坏框架功能模块间的耦合性而代码的质量也由此而提升皆大欢喜。