如何在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中的字段,这是有道理的,因为它是LazyReference,直到我调用mongoengines fetch()函数。我认为必须有一种方法可以在转储LazyReference之前将其获取,但是我不知道如何。

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

解决方法

啊,我自己找到了解决方案。除了使用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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...