Как принять None для поля типа String при использовании Flask -RESTPlus - PullRequest
1 голос
/ 20 февраля 2020

Я только начинаю разработку с flask -restplus, и я не являюсь носителем языка,

, но я постараюсь описать свой вопрос настолько ясно, насколько смогу.

Я знаю, что в flask есть модуль fields, который помогает нам определять и фильтровать тип данных ответа,

, такой как String, Integer, List и т. Д.

Есть ли способ разрешить NULL / None при использовании модуля fields?

Ниже приведен мой код, который использует модуль field для перехвата значения,

add_group = api.model(
        "add_group",
        {"team_groups": fields.List(fields.Nested(api.model("team_groups", {
            "name": fields.String(example="chicago bulls", description="name of add group"),
            "display_name": fields.String(example="bulls", description="display name of add group")})))})

и если тип данных display_name не является строкой, возникнет следующая ошибка:

{
    "errors": {
        "team_groups.0.display_name": "123 is not of type 'string'"
    },
    "message": "Input payload validation failed"
}

, что мне нужно при вводе display_name, я могу ввести bulls или None


Кажется, можно найти только несколько справочных данных / вопросов, и я нашел только один результат , связанный

с моим вопросом , но в конечном итоге преобразуется в ненулевое значение для решения проблемы.

, если есть какая-то часть моего вопроса, не очень понятная,

пожалуйста, дайте мне знать, спасибо.

мое окружение для разработки:

flask-restplus 0.13.0 Python 3.7.4 postman 7.18.1


Вот мой обновленный код:

from flask_restplus import Namespace, fields

class NullableString(fields.String):
    __schema_type__ = ['string', 'null']
    __schema_example__ = 'nullable string'

class DeviceGroupDto:
    api = Namespace("device/group", description="device groups")
    header = api.parser().add_argument("Authorization", location="headers", help="Bearer ")

    get_detail_group = api.model(
        "getdetail",
        {"team_groups": fields.List(fields.String(required=True,
                                                  description="team group id to get detail", example=1))})

    add_group = api.model(
        "add_group",
        {"team_groups": fields.List(fields.Nested(api.model("team_groups", {
            "name": fields.String(example="chicago bulls", description="name of add group"),
            "display_name": NullableString(attribute='a')})))})

, если я введу следующую полезную нагрузку: (почтальоном)

{
    "team_groups": [
        {
            "name": "chicago bulls",
            "display_name": null
        }
    ]
}

Он по-прежнему возвращает:

{
    "errors": {
        "team_groups.0.display_name": "None is not of type 'string'"
    },
    "message": "Input payload validation failed"
}

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

, если некоторые из ваших полей являются необязательными, сделайте required=False

add_group = api.model(
        "add_group",
        {"team_groups": fields.List(fields.Nested(api.model("team_groups", {
            "name": fields.String(example="chicago bulls", description="name of add group"),
            "display_name": fields.String(example="bulls", description="display name of add group", required=False)})))})
0 голосов
/ 05 марта 2020

Да, вы можете создать дочерний класс и использовать его вместо классов по умолчанию, которые также будут принимать None

class NullableString(fields.String):
    __schema_type__ = ['string', 'null']
    __schema_example__ = 'nullable string'

Таким образом, ваш код будет выглядеть как

{ "property": NullableString(attribute=value)}

Дополнительно Вы можете посетить номер github.com / noirbizarre / flask -restplus / Issues / 179

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...