Tengo estos modelos de mongoengine declarados:
class SyncDiscrepancy(EmbeddedDocument): upi = StringField(primary_key=True) error_code = IntField(required=True) meta = { 'indexes': ['upi', 'error_code'] } ########## END SYNC class Flight(Document): identifier = StringField(primary_key=True) env = StringField(required=True, max_length=3) peak = IntField(required=True) carrier = StringField(required=True, max_length=3) number = IntField(required=True) boardpoint = StringField(required=True) offpoint = StringField(required=True) date = DateTimeField(required=True) status = StringField(required=True) # store comments comments = StringField() last_modified = DateTimeField(required=True) local_discrepancies = ListField(EmbeddedDocumentField(LocalDiscrepancy)) sync_discrepancies = ListField(EmbeddedDocumentField(SyncDiscrepancy)) count_local = IntField(required=True) count_sync = IntField(required=True) meta = { 'indexes': ['_id', 'env','peak', 'date'], 'ordering': ['-date'] }
Y pruebo un básico
>>> sy = SyncDiscrepancy(upi='axzdsa', error_code=2) >>> fl = Flight() >>> fl.sync_discrepancies.append(sy) >>> fl.save() Traceback (most recent call last): File "", line 1, in fl.save() File "/usr/lib/python2.7/site-packages/mongoengine/document.py", line 224, in save self.validate(clean=clean) File "/usr/lib/python2.7/site-packages/mongoengine/base/document.py", line 323, in validate raise ValidationError(message, errors=errors) ValidationError: ValidationError (Flight:None) (Invalid embedded document instance provided to an EmbeddedDocumentField: ['sync_discrepancies'] Field is required: ['status', 'count_local', 'offpoint', 'identifier', 'number', 'boardpoint', 'last_modified', 'peak', 'env', 'carrier', 'date', 'count_sync'])
Ahora sé que no llené los campos requeridos para el flight
, pero incluso si lo hago, todavía recibo este error. Invalid embedded document instance provided to an EmbeddedDocumentField: ['sync_discrepancies']
. ¿Cuál es exactamente el problema con cómo declaro el SyncDiscrepancy
y SyncDiscrepancy
el vuelo?
Utilizando mongoengine==0.8.7
EDITAR lo acortó a
class SyncDiscrepancy(EmbeddedDocument): error_code = IntField() class Flight(Document): sync_discrepancies = ListField(EmbeddedDocumentField(SyncDiscrepancy))
y:
>>> sy = SyncDiscrepancy(error_code=2) >>> fl = Flight() >>> fl.sync_discrepancies.append(fl) >>> fl.save() Traceback (most recent call last): File "", line 1, in fl.save() File "/usr/lib/python2.7/site-packages/mongoengine/document.py", line 224, in save self.validate(clean=clean) File "/usr/lib/python2.7/site-packages/mongoengine/base/document.py", line 323, in validate raise ValidationError(message, errors=errors) ValidationError: ValidationError (Flight:None) (Invalid embedded document instance provided to an EmbeddedDocumentField: ['sync_discrepancies']) >>>
No entiendo por qué me sale este error.
Terminé cambiando el orden de las declaraciones del modelo y simplemente funcionó (es decir, declarar el modelo después de ser referenciado (???))
class Flight(Document): sync_discrepancies = ListField(EmbeddedDocumentField('SyncDiscrepancy')) class SyncDiscrepancy(EmbeddedDocument): error_code = IntField()
Me estaba volviendo loco con este error y, en mi caso, las clases de documentos incrustados estaban referenciadas por su nombre (usando una notación de comillas) y eliminando las comillas que solucionaban el problema.
Tuve algo como esto:
class SyncDiscrepancy(EmbeddedDocument): error_code = IntField() class Flight(Document): sync_discrepancies = ListField(EmbeddedDocumentField('SyncDiscrepancy'))
Cambiándolo a esto
class SyncDiscrepancy(EmbeddedDocument): error_code = IntField() class Flight(Document): sync_discrepancies = ListField(EmbeddedDocumentField(SyncDiscrepancy))
arreglado el problema