Django Rest Framework - условно сделать поле сериализатора обязательным или не использовать другое значение поля - PullRequest
1 голос
/ 21 мая 2019

В моем проекте 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 обязательным.

  1. Какой метод является подходящим пространством для достижения этого и как я могу это сделать?
  2. Также используя приведенную выше логику, я хочу провести дополнительную проверку на поле. Пример: is account_type is PRIVATE и person_name не пусто, я хочу провести некоторую проверку на person_name (проверьте, имеет ли он правильный формат, длину и т. Д.)

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Вы можете определить два сериализатора PrivateSerializer и CompanySerializer, затем, по вашему мнению, использовать метод .get_serializer_class(), и в зависимости от того, что отправляется в запросе, вы возвращаете один или другой.

Таким образомВы определяете каждую сериализацию валидаций в зависимости от случая.

0 голосов
/ 21 мая 2019

Вы можете использовать метод validate сериализатора, который получает все сериализованные поля в качестве параметра, см. здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...