如何序列化一侧具有多对一关系的嵌套对象?
How to serialize a nested object with the many-to-one relationship in one side?
我在使用 Marshmallow-sqlAlchemy 序列化对象时遇到了一些问题。
我有两个对象:
class Product(Model):
__tablename__: product_table_name
id = Column(Integer, primary_key=True)
name = Column(String)
class BasketItem(Model):
__tablename__: basket_item_table_name
id = Column(Integer, primary_key=True)
product_id = Column(
Integer, ForeignKey(f"{product_table_name}.id"), nullable=False
)
product = relationship("Product", foreign_keys="BasketItem.product_id")
这是棉花糖配置:
class ProductBasketItemSchema(ModelSchema):
class Meta:
model = Product
fields = ("id", "name",)
class BasketItemSchema(ModelSchema):
class Meta:
model = BasketItem
include_relationships = True
fields = ("id", "product",)
product: Nested(ProductBasketItemSchema, many=False)
但是basket_item_schema.dump(items)
的输出只打印产品的ID,不打印内容:
[{'id': 1, 'product': 123}]
而不是
[{'id': 1, 'product': {'id': 123, 'name': 'first'}}]
我认为问题出在架构声明上,因为我可以在转储之前访问产品的所有字段。
我是不是漏掉了什么?
调试 Marshmallow 库后,我进入了死胡同。
这无法完成,因为我正试图显示 chid 对象的父对象。这只能用于一对多或多对多,但不能用于多对一关系。
为此,我使用了带有 Schema
(而不是 ModelSchema
)的自定义棉花糖映射器,如下所示:
class ProdcutField(Field):
def __init__(self, **kwargs):
self.schema = ProductBasketItemSchema()
super().__init__(**kwargs)
def _serialize(self, value, attr, obj, **kwargs):
return self.schema.dump(value)
class BasketItemSchema(Schema):
id = fields.Integer()
product = ProductField()
当使用 marshmallow_sqlalchemy 中的 ModelSchema
时,字段会自动映射并检查关系类型。对于多对一,它只序列化对象的 id。我一直在寻找我是否可以重写一些功能,但是这样不行,所以我手动实现了,如上所示。
我希望这会对其他人有所帮助。
我在使用 Marshmallow-sqlAlchemy 序列化对象时遇到了一些问题。
我有两个对象:
class Product(Model):
__tablename__: product_table_name
id = Column(Integer, primary_key=True)
name = Column(String)
class BasketItem(Model):
__tablename__: basket_item_table_name
id = Column(Integer, primary_key=True)
product_id = Column(
Integer, ForeignKey(f"{product_table_name}.id"), nullable=False
)
product = relationship("Product", foreign_keys="BasketItem.product_id")
这是棉花糖配置:
class ProductBasketItemSchema(ModelSchema):
class Meta:
model = Product
fields = ("id", "name",)
class BasketItemSchema(ModelSchema):
class Meta:
model = BasketItem
include_relationships = True
fields = ("id", "product",)
product: Nested(ProductBasketItemSchema, many=False)
但是basket_item_schema.dump(items)
的输出只打印产品的ID,不打印内容:
[{'id': 1, 'product': 123}]
而不是
[{'id': 1, 'product': {'id': 123, 'name': 'first'}}]
我认为问题出在架构声明上,因为我可以在转储之前访问产品的所有字段。
我是不是漏掉了什么?
调试 Marshmallow 库后,我进入了死胡同。
这无法完成,因为我正试图显示 chid 对象的父对象。这只能用于一对多或多对多,但不能用于多对一关系。
为此,我使用了带有 Schema
(而不是 ModelSchema
)的自定义棉花糖映射器,如下所示:
class ProdcutField(Field):
def __init__(self, **kwargs):
self.schema = ProductBasketItemSchema()
super().__init__(**kwargs)
def _serialize(self, value, attr, obj, **kwargs):
return self.schema.dump(value)
class BasketItemSchema(Schema):
id = fields.Integer()
product = ProductField()
当使用 marshmallow_sqlalchemy 中的 ModelSchema
时,字段会自动映射并检查关系类型。对于多对一,它只序列化对象的 id。我一直在寻找我是否可以重写一些功能,但是这样不行,所以我手动实现了,如上所示。
我希望这会对其他人有所帮助。