Разрешить дефисы в именах полей сериализатора Django Rest Framework - PullRequest
1 голос
/ 05 апреля 2019

Учитывая спецификацию OpenAPI, для которой я пишу код, требующий имен переменных дефиса (aka kebab-case) в теле запроса, как это следует обрабатывать при использовании Django Rest Framework?

Например, запрос POST /thing на создание вещи имеет следующее тело:

{
    "owner-type": "platform"
}

Но в Python owner-type не является допустимым именем переменной («SyntaxError: не может быть назначен оператору»), поэтому вместо Thing имеет owner_type в определении модели:

class Thing(models.Model):
    owner_type = models.CharField(max_length=8)

Но теперь ThingSerializer проблематично, потому что, опять же, owner-type является недопустимым именем. Это не разрешено:

    owner-type = serializers.CharField(...)

Я пытался переопределить, как имена генерируются в ModelSerializer, пытаясь настроить имена полей, генерируемые get_fields(), но это не удалось. Вот мой сериализатор:

class ThingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Thing
        fields = [
            'owner_type',
        ]

    def get_fields(self):
        fields = super().get_fields()
        out_fields = OrderedDict()
        for field_name, field in fields.items():
            out_fields[field_name.replace('_', '-')] = field
        return out_fields

и ошибка:

../venv/lib/python3.6/site-packages/rest_framework/fields.py:453: in get_attribute
    return get_attribute(instance, self.source_attrs)
../venv/lib/python3.6/site-packages/rest_framework/fields.py:101: in get_attribute
    instance = getattr(instance, attr)
E   AttributeError: 'Thing' object has no attribute 'owner-type'

Итак, мой вопрос - как я могу настроить сериализатор модели DRF, чтобы разрешить сериализацию / десериализацию полей модели, которые содержат подчеркивание, чтобы клиент API видел дефисы вместо подчеркиваний? Это было бы общее решение для примера выше, где Thing.owner_type должно быть доступно для чтения / записи, передавая поле "owner-type" в теле JSON.

Я использую последние версии Django и DRF на Python 3.6.

Редактировать 1: Уточнил, что в идеале это будет общее решение, которое переводит подчеркивания в дефисы.

1 Ответ

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

Измените ваш сериализатор на belwo,

class ThingSerializer(serializers.ModelSerializer):
    <b>def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields.update({"owner-type": serializers.CharField(write_only=True)})</b>


    class Meta:
        model = Thing
        <b>fields = '__all__'
        read_only_fields = ('owner_type',)

    def create(self, validated_data):
        validated_data['owner_type'] = validated_data.pop('owner-type')
        return super().create(validated_data)</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...