gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:00:28 26 4
gpt4 key购买 nike

在我的 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)

和序列化程序中的 ItemSerializer,例如:

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

现在,在我的序列化程序中,如果帐户类型是公司或私有(private),我想将特定字段设为必填。例如,如果 account_type 是 COMPANY,我想使字段 company_name 成为必填字段。如果 account_type 是 PRIVATE,我想让 person_name 成为必填项。

  1. 哪种方法适合实现这一点,我该怎么做?
  2. 还使用上述逻辑,我想在该字段上进行额外的验证。示例:account_typePRIVATE 并且 person_name 不为空,我想对 person_name 进行一些验证(检查它是否具有正确的格式,长度等)

最佳答案

您可以使用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

关于python - Django Rest Framework - 有条件地使序列化程序的字段成为必需的或不使用其他字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56239338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com