Is_valid сериализатора Django возвращает True, даже если validate возвращает False - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть такая функция POST:

    def post(self, request):
    try:

        serializer = CCTDSPostSerializer(data=request.data)
        print("serializer", serializer)
        print("is valid", serializer.is_valid())

Сериализатор работает следующим образом, по определенным причинам он не является сериализатором модели.

class CCTDSPostSerializer(serializers.Serializer):
status = serializers.CharField()
transaction = serializers.CharField(allow_blank=True, allow_null=True)
comment = serializers.CharField(allow_blank=True, allow_null=True)
tds_id = serializers.ListField(child=serializers.IntegerField())

def check_tds_eligibility(self, data):
    tds_ids = data.get('tds_id', None)

    if tds_ids is not None:
        tds_obj = TDS.objects.filter(id__in=tds_ids, status='open')
        if tds_obj.count() == len(tds_ids):
            return tds_ids
    return None

def validate_status_transaction(self, obj):
    status = obj.get('status', None)
    transaction = obj.get('transaction', None)

    if status == 'closed' and transaction is not None:
        return True
    elif status == 'rejected' and transaction is None:
        return True
    return False

def validate(self, obj):
    validate_status_transaction = self.validate_status_transaction(obj)
    tds_ids = self.check_tds_eligibility(obj)
    if validate_status_transaction and tds_ids:
        print("returning obj")
        return obj
    print("returning false")
    return False

Данные, которые я передаюэто:

{
    "tds_id":[1],
    "status":"closed",
    "transaction":"ABC",
    "comment":"Boom"
}

Теперь, основываясь на условиях для данных, присутствующих в базе данных, речь идет об операторе print("returning false"), т.е. он возвращает False, но на стороне просмотра - оператор serializer.is_valid() дает вывод в виде True

Почему функция проверки возвращает False, а is_valid возвращает True?

1 Ответ

0 голосов
/ 29 сентября 2018

validate метод возвращает проверенную дату или ошибку повышения.Поскольку ваш метод validate не вызывает никаких ошибок, is_valid() возвращает True.Измените метод, как это, чтобы исправить:

def validate(self, obj):
    validate_status_transaction = self.validate_status_transaction(obj)
    tds_ids = self.check_tds_eligibility(obj)
    if validate_status_transaction and tds_ids:
        print("returning obj")
        return obj
    print("returning false")
    raise serializers.ValidationError("Some error")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...