Пользовательский валидатор для вложенного поля в сериализаторе - PullRequest
0 голосов
/ 25 апреля 2018

В моем BookSerializer у меня есть вложенное поле page :

class PageSerializer(serializers.ModelSerializer):
    ...

class BookSerializer(serializers.ModelSerializer):
    page = PageSerializer()

, а валидатор поля page ожидает словарь какзначение.Но я хочу, чтобы он также принимал целое число (идентификатор страницы).Поэтому в BookSerializer я пытался переопределить функцию validate для поля страницы, но она не работала:

class BookSerializer(serializers.ModelSerializer):
    page = PageSerializer()

    def validate_page(self, value):
        if isinstance(value, int):
            return value

        # if value is not an integer, reuse the default validator
        # but django said that validate_page is not a function
        return super().validate_page()

Похоже на validate_page функция никогда не вызывается, потому что это вложенное поле.

Спасибо!

1 Ответ

0 голосов
/ 24 апреля 2019

Правильный способ создания пользовательской проверки:

def validate_page(self, value):
    if isinstance(value, int):
        return value
    return value

Но это не сработает.

Вам необходимо переопределить функцию to_internal в сериализаторе страниц:

class PageSerializer(serializers.ModelSerializer):
    def to_internal_value(self, data):
        return get_object_or_404(Page, pk=data)
    ...

class BookSerializer(serializers.ModelSerializer):
    page = PageSerializer()
...