Почему `data` пуст во вложенном методе проверки сериализатора? - PullRequest
1 голос
/ 28 января 2020

Я использую Django REST Framework. У меня есть родительский класс сериализатора, например, так:

class MyParentSerializer(serializers.Serializer):

  # Use custom serializer as a field.
  my_field = MyFieldSerializer(
      required=False,
  )

  name = serializers.Charfield()
}

  def validate(data):
    # validation logic

А потом мой дочерний сериализатор, который используется выше, выглядит следующим образом:

class MyFieldSerializer(serializers.Serializer):

    email_address = serializers.ListField(
        required=False,
        child=serializers.CharField(),
    )

    phone_number = serializers.ListField(
        required=False,
    )

    def validate(self, data):
        data <-- <-- This is empty if I pass in random invalid data!
        check_for_undefined_fields(self.data, self.fields)
        return data

Теперь я передаю следующие данные:

{
  "my_field": { "invalid_field": "foo"},
  "name": "bar"
}

Однако, если я проверю data в методе validate в моем MyFieldSerializer классе во время проверки, ЭТО ПУСТО!

Почему? Как я могу это исправить, чтобы data на самом деле данные, которые я передал?

Ответы [ 2 ]

1 голос
/ 29 января 2020

Вы не используете ModelSerializer, поэтому каждое поле в запросе должно быть добавлено в Serializer. В вашем случае вам просто нужно определить invalid_field

  class MyFieldSerializer(serializers.Serializer):

    email_address = serializers.ListField(
        required=False,
        child=serializers.CharField(),
    )

    phone_number = serializers.ListField(
        required=False,
    )
    invalid_field = serializers.CharField()

    def validate(self, data):
        data <-- <-- This is empty if I pass in random invalid data!
        check_for_undefined_fields(self.data, self.fields)
        return data
0 голосов
/ 28 января 2020

Только поля, которые вы объявили, будут доступны в методах validate или is_valid или create. Если вам нужно получить доступ к этим полям, вы можете использовать self.initial_data.

...