Как я могу проверить поле сериализатора с ModelSerializer. Должен ли метод validate () вызываться при создании или мне нужно вызывать метод - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть сериализатор (ModelSerializer), где мне нужно проверить поле, которое будет передано методу validate.

CompanySerializer

class CompanySerializer(serializers.ModelSerializer):

    def validate_vat_number(self, vat_no):

        vatlayer = "http://apilayer.net/api/validate?access_key={api_key}&vat_number={VAT_NUMBER}".format(api_key=settings.VATLAYER, VAT_NUMBER=vat_no)

        vatlayer = json.loads(vatlayer)

        if vatlayer['valid'] is not True:
            raise serializers.ValidationError("VAT number not valid")

        return vat_no

    class Meta:
        model = Company
        fields = ('profile', 'name', 'address', 'currency', 'id_number', 'vat_number', 'vat_company_name', 'email', 'phone', 'fixed_phone')

Мой вопрос есть, вызывается ли метод validate_vat_number при запуске метода create, и если да, то как мне передать параметр vat_no? Если нет, где я могу вызвать этот метод? И возможно ли это сделать без перезаписи метода create?

Мое представление

class CompanyAPI(viewsets.ModelViewSet):

    queryset = Company.objects.all()
    serializer_class = CompanySerializer

Было бы идеально, если бы я мог как-то проверить без использования @action в представлении, так как это создает другую конечную точку. Моя цель - проверить и сохранить объект одним почтовым запросом

1 Ответ

0 голосов
/ 14 февраля 2020

Вот порядок проверки:

  1. Десериализация поля ( serializer.to_internal_value и field.run_validators )
  2. serializer.validate_ [field] вызывается для каждого поля
  3. Вызывается валидатор уровня сериализатора ( serializer.run_validation )
  4. serializer.validate
  5. метод create вызывается после завершения всех проверок.

Так что в вашем случае, поскольку это не ошибка поля, а ошибка проверки, Вы должны использовать подтверждение уровня объекта (шаг 4):

def validate(self, data):
    vatlayer = "http://apilayer.net/api/validate?access_key={api_key}&vat_number={VAT_NUMBER}".format(api_key=settings.VATLAYER, VAT_NUMBER=data[vat_no])

    vatlayer = json.loads(vatlayer)

    if vatlayer['valid'] is not True:
        raise serializers.ValidationError("VAT number not valid")

    return data
...