Django Rest 框架 - 有条件地使序列化程序的字段成为必需的或不使用其他字段值



在我的DRF项目中,我有一个模型:

class Item(BaseModel):
    PRIVATE = 'PRIVATE'
    COMPANY = 'COMPANY'
    ACCOUNT_TYPES = (
        (PRIVATE, _('Private')),
        (COMPANY, _('Company')),
    )
    company_name = models.CharField(max_length=128, null=True, blank=True)
    person_name = models.CharField(max_length=128, null=True, blank=True)
    account_type = models.CharField(max_length=32, choices=ACCOUNT_TYPES)
    phone = models.CharField(max_length=128, null=True, blank=True)
    email = models.EmailField(max_length=128, null=True, blank=True)

和serializer中的tookererializer,例如:

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('account_type', 'company_name', 'person_name')
    def create(self, validated_data):
        print('ItemSerializer, create')
        print('validated_data:', validated_data)
        return super().create(validated_data)
    def validate(self, attrs):
        print('ItemSerializer validate, attrs:', attrs)
        return attrs

您可以在模型中看到的,其中有company_nameperson_name字段,模型中都不需要。

要创建一个项目,必须指定account_type。它的PRIVATECOMPANY

现在,在我的序列化机中,如果帐户类型是公司或私人,我想制定需要特定字段。例如,是account_type是 COMPANY,我想制作需要 company_name。如果counce_type是 PRIVATE,我想制作person_name

  1. 哪种方法是一个适当的空间来实现这一目标?
  2. 我该怎么做?
  3. 也使用上述逻辑,我想在现场上进行额外的验证。示例:account_typePRIVATE,并且Person_name不是空的,我想在person_name上进行一些验证(检查它是否具有正确的格式,长度等(
  4. (

您可以使用def validate(self, data)检查所需条件,和def validate_{field_name}(self, value)进行额外验证:

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('account_type', 'company_name', 'person_name')
        extra_kwargs = {
            'company_name': {'required': False},
            'person_name': {'required': False},
        }
    def validate(self, data):
        data_dict = dict(data)
        data_keys = data.keys()
        account_type= data_dict.get('account_type')
        if account_type == 'PRIVATE' and 'person_name' not in data_keys:
            raise serializers.ValidationError('person_name required when account_type is PRIVATE.')
        if account_type == 'COMPANY' and 'company_name' not in data_keys:
            raise serializers.ValidationError('company_name required when account_type is COMPANY.')
        return data
    def validate_person_name(self, value):
        if len(value) < 10:
            raise serializers.ValidationError('person_name must be at least 10 characters.')
        return value

您可以使用接收所有序列化字段作为参数的序列化器的validate方法,请参见此处。

您可以定义两个序列化 PrivateSerializerCompanySerializer,然后在您的视图中,使用方法 .get_serializer_class(),并取决于请求中发送的内容。

>

这样,您根据情况定义每个序列化验证。

最新更新