Django REST:如何批量将所有Serializer字段设为非必填?
问题
有没有办法将Serializer的所有字段默认设置为非必填?逐个为每个Serializer的每个字段设置required=False太耗时,希望找到快捷方法。
当前手动设置的示例代码:
class ComputersSerializer(serializers.ModelSerializer): name = serializers.CharField(required=False) serial = serializers.CharField(required=False) otherserial = serializers.CharField(required=False) contact = serializers.CharField(required=False) contact_num = serializers.CharField(required=False) comment = serializers.CharField(required=False) date_mod = serializers.DateTimeField(required=False) is_template = serializers.IntegerField(default=0) template_name = serializers.CharField(required=False) is_deleted = serializers.IntegerField(default=0) is_dynamic = serializers.IntegerField(default=0) ticket_tco = serializers.DecimalField(max_digits=20, decimal_places=4, required=False) uuid = serializers.CharField(required=False) date_creation = serializers.DateTimeField(required=False) is_recursive = serializers.IntegerField(default=0) last_inventory_update = serializers.DateTimeField(required=False) computertypes = ComputertypesSerializer(required=False) computermodels = ComputermodelsSerializer(required=False) entities = EntitiesSerializer(required=False) networks = NetworksSerializer(required=False) locations = LocationsSerializer(required=False) autoupdatesystems = AutoupdatesystemsSerializer(required=False) users = assistanceSerializers.UsersSerializer(required=False) groups = assistanceSerializers.GroupsSerializer(required=False) states = StatesSerializer(required=False) users_tech = assistanceSerializers.UsersSerializer(required=False) groups_tech = assistanceSerializers.GroupsSerializer(required=False) manufacturers = ManufacturersSerializer(required=False) class Meta: model = Computers fields = '__all__'
解决方案
方法1:自定义通用基类Serializer
创建一个基类,重写build_standard_field方法,自动将所有字段的required设为False,后续的Serializer都继承这个基类即可。
from rest_framework import serializers class NonRequiredFieldsModelSerializer(serializers.ModelSerializer): def build_standard_field(self, field_name, model_field): field_class, field_kwargs = super().build_standard_field(field_name, model_field) field_kwargs['required'] = False return field_class, field_kwargs
使用时直接继承该基类,仅需定义有特殊配置的字段:
class ComputersSerializer(NonRequiredFieldsModelSerializer): is_template = serializers.IntegerField(default=0) is_deleted = serializers.IntegerField(default=0) is_dynamic = serializers.IntegerField(default=0) is_recursive = serializers.IntegerField(default=0) computertypes = ComputertypesSerializer(required=False) computermodels = ComputermodelsSerializer(required=False) # ...其他嵌套字段 class Meta: model = Computers fields = '__all__'
方法2:在Serializer的__init__方法中动态修改字段
若不想创建基类,可在Serializer初始化时遍历所有字段,修改required属性:
class ComputersSerializer(serializers.ModelSerializer): class Meta: model = Computers fields = '__all__' def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 批量设置所有字段为非必填 for field_name, field in self.fields.items(): field.required = False # 单独配置带默认值的字段 self.fields['is_template'].default = 0 self.fields['is_deleted'].default = 0 self.fields['is_dynamic'].default = 0 self.fields['is_recursive'].default = 0
方法3:批量处理嵌套序列化器
针对大量嵌套序列化器,可创建一个通用嵌套基类,默认设置required=False:
class NonRequiredNestedSerializer(serializers.Serializer): def __init__(self, *args, **kwargs): kwargs.setdefault('required', False) super().__init__(*args, **kwargs) # 所有嵌套序列化器继承该基类 class ComputertypesSerializer(NonRequiredNestedSerializer, serializers.ModelSerializer): class Meta: model = Computertypes fields = '__all__'
后续在主Serializer中引用嵌套序列化器时,无需手动添加required=False。
内容的提问来源于stack exchange,提问作者Sydney
相关产品推荐
相关产品推荐

