Учитывая спецификацию 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: Уточнил, что в идеале это будет общее решение, которое переводит подчеркивания в дефисы.