-1

我在用 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'}}]

我认为问题出在 Schema 声明上,因为我可以在转储产品之前访问产品的所有字段。

我错过了什么吗?

4

1 回答 1

0

调试完 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()

当使用ModelSchemafrom marshmallow_sqlalchemy 时,字段会自动映射并检查关系类型。而对于多对一,它只序列化对象的 id。我一直在寻找是否可以覆盖一些函数,但是不能这样做,所以我手动实现了它,如上图所示。

我希望这对其他人有帮助。

于 2020-06-23T16:23:21.753 回答