自定义棉花糖URLFor中使用的ID

时间:2019-05-23 09:16:30

标签: flask flask-sqlalchemy python-3.7 marshmallow

我正在使用Sqlite数据库,并使用flask,棉花糖,sqlalchemy充当前端项目的Web api。 我正在使用存储为数据库中的blob的UUID,并试图在数据返回调用代码时对其进行样式化。 我可以使用棉花糖的Function字段在模型中返回ID时将其转换,但是使用HyperLinks,该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 :(得分:0)

我找到了解决方法。是建立模型的过程,而不是棉花糖。 当数据库将pk作为blob存储时,我能够使用SQLAlchemy_utils UUID列,将二进制文件设置为true,并且一切正常:

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