You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:50:17