如何将嵌套的棉花糖模式与 Mongoengines lazyReferenceFields 一起使用?

How to use nested marshmallow schemas with Mongoengines lazyReferenceFields?

我定义了以下棉花糖模式和 mongoengine 类:

class DataReport(Document):
    id = ObjectIdField(required=True)
    firmware_statistics_report_reference_id = LazyReferenceField(FirmwareReport, required=True)
    ...

class DataReportSchema(Schema):
    id = fields.Str()
    firmware_statistics_report_reference_id = fields.Nested(FirmwareReportSchema)
    ...

class FirmwareReport(Document):
    id = ObjectIdField(required=True)
    firmware_id_list = ListField(required=True))
    ...

class FirmwareReportSchema(Schema):
    id = fields.Str()
    firmware_id_list = fields.List(fields.Str())
    ...

report = DataReport().objects.get(pk=...)
DataReportSchema().dump(report)

是否可以从 mongoengine 转储带有 LazyReferenceField 的嵌套模式?我想要的是获取子架构中定义的所有字段,但是当使用 LazyReferenceField 引用时,我没有找到获取完整架构数据的方法。

如果我转储 DataReportSchema,我只会获得引用的对象 ID,而不是 FirmwareReportSchema 中的字段,这是有道理的,因为它是一个延迟引用,直到我调用 mongoengines fetch() 函数。我假设必须有一种方法可以在转储之前获取 LazyReference,但我不明白如何。

是否可以在 marshmallow dump() 之前 fetch() LazyReference,以便从子模式中获取完整转储而不仅仅是对象 ID?

啊我自己找到了解决办法。可以使用 fields.Method 方法代替 fields.Nested 方法。然后可以在自定义方法中获取()id:

class DataReportSchema(Schema):
    id = fields.Str()
    report_date = fields.DateTime()
    firmware_statistics_report_reference_id = fields.Method("get_firmware_schema")

    def get_firmware_schema(self, data_statistics_report):
      firmware_report = data_statistics_report.firmware_statistics_report_reference_id.fetch()
      return FirmwareStatisticsReportSchema().dump(firmware_report)