Настройка идентификатора, используемого в Marshmallow URLFor - PullRequest
0 голосов
/ 23 мая 2019

Я использую базу данных Sqlite и флешку, зефир, sqlalchemy в качестве веб-API для внешнего интерфейса проекта. Я использую UUID, хранящийся в виде большого двоичного объекта в базе данных, и пытаюсь стилизовать данные, когда они возвращаются в вызывающий код. Я могу преобразовать Id, если он возвращен в модели, используя поле «Зефир», но с помощью гиперссылок Id все еще выводится в виде строки байтового массива:

class Item(Base):
    __tablename__ = 'Items'

    Id = Column(LargeBinary, primary_key=True)

    def __repr__(self):
        return '<Item {}>'.format(self.Name)

class ItemSchema(ma.Schema):
    Id = fields.Function(lambda obj: str(UUID(bytes=obj.Id)))
    _links = ma.Hyperlinks(
        {"url": ma.URLFor("item_detail", id="<Id>"), "collection": ma.URLFor("items")}
    )
    class Meta: 
        fields = ("_links", "Id")

Есть ли способ отформатировать , который выводится в ссылках? то есть

{"url": ma.URLFor("item_detail", id="<str(UUID(bytes=Id))>"), "collection": ma.URLFor("items")}

Вот как в данный момент выводится:

{"_links": {"url": "/api/items/b%27%5Cx86%5Cxacx__%5Cxf9%5Cxc2J%5Cx80a6%5Cxa7%5Cx95%5Cx10%5Cx91%5Cxff%27", "collection": "/api/items"}, "Id": "86ac785f-5ff9-c24a-8061-36a7951091ff"}

Я хочу, чтобы это выглядело так:

{"_links": {"url": "/api/items/86ac785f-5ff9-c24a-8061-36a7951091ff", "collection": "/api/items"}, "Id": "86ac785f-5ff9-c24a-8061-36a7951091ff"}

Я хочу, чтобы ссылка использовала формат UUID, а не байтовый массив.

1 Ответ

0 голосов
/ 28 мая 2019

Я нашел способ обойти это. Это было с моделью, а не с зефиром. Поскольку база данных была / хранит pk как большой двоичный объект, я смог использовать столбец SQLAlchemy_utils UUID, установив для двоичного файла значение true, и все это работало:

from sqlalchemy_utils import UUIDType
from uuid import UUID
....
Id = Column(UUIDType(binary=True), primary_key=True)
...