我定义了以下棉花糖架构和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中的字段,这是有道理的,因为它是LazyReference,直到我调用mongoengines fetch()函数。我认为必须有一种方法可以在转储LazyReference之前将其获取,但是我不知道如何。
是否可以在棉花糖dump()之前获取(LazyReference),以便从子模式中获得完整的转储,而不仅仅是对象ID?
答案 0 :(得分:0)
啊,我自己找到了解决方案。除了使用fields.Nested方法之外,还可以使用fields.Method方法。然后可以在自定义方法中获取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)