В моем проекте 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_name
и person_name
, ни одно из них не требуется в модели.
Чтобы создать элемент, необходимо указать account_type
. Это либо PRIVATE
, либо COMPANY
.
Теперь в моем сериализаторе я хочу сделать определенные поля обязательными, если тип учетной записи - компания или частный Например, если account_type равен COMPANY
, я хочу сделать поле company_name
обязательным. Если account_type - PRIVATE
, я хочу сделать person_name
обязательным.
- Какой метод является подходящим пространством для достижения этого и как я могу это сделать?
- Также используя приведенную выше логику, я хочу провести дополнительную проверку на поле. Пример: is
account_type
is PRIVATE
и person_name не пусто, я хочу провести некоторую проверку на person_name
(проверьте, имеет ли он правильный формат, длину и т. Д.)