def __set_gj_flag_sub_field(self, instance, fld, cur_depth):
"""Set $$good_json$$ flag to subfield."""
from .fields import FollowReferenceField
def set_good_json(fld):
setattr(fld, "$$good_json$$", True)
setattr(fld, "$$cur_depth$$", cur_depth)
@singledispatch
def set_flag_recursive(fld, instance):
set_good_json(fld)
@set_flag_recursive.register(db.ListField)
def set_flag_list(fld, instance):
set_good_json(fld.field)
@set_flag_recursive.register(db.EmbeddedDocumentField)
def set_flag_emb(fld, instance):
if isinstance(instance, Helper):
instance.begin_goodjson(cur_depth)
@set_flag_recursive.register(FollowReferenceField)
def set_flag_self(fld, instance):
set_good_json(fld)
set_flag_recursive(fld, instance)
python类EmbeddedDocumentField()的实例源码
def __unset_gj_flag_sub_field(self, instance, fld, cur_depth):
"""Unset $$good_json$$ to subfield."""
from .fields import FollowReferenceField
def unset_flag(fld):
setattr(fld, "$$good_json$$", None)
setattr(fld, "$$cur_depth$$", None)
delattr(fld, "$$good_json$$")
delattr(fld, "$$cur_depth$$")
@singledispatch
def unset_flag_recursive(fld, instance):
unset_flag(fld)
@unset_flag_recursive.register(db.ListField)
def unset_flag_list(fld, instance):
unset_flag(fld.field)
@unset_flag_recursive.register(db.EmbeddedDocumentField)
def unset_flag_emb(fld, instance):
if isinstance(instance, Helper):
instance.end_goodjson(cur_depth)
@unset_flag_recursive.register(FollowReferenceField)
def unset_flag_self(fld, instance):
unset_flag(fld)
unset_flag_recursive(fld, instance)
def _document_typeof(doc_cls, field_name):
try:
orm_field = doc_cls._fields[field_name]
except (KeyError, AttributeError):
return None
if isinstance(orm_field, ListField):
orm_field = orm_field.field
if isinstance(orm_field, (ReferenceField, EmbeddedDocumentField)):
return orm_field.document_type
return None
def _follow_reference(self, max_depth, current_depth,
use_db_field, *args, **kwargs):
from .fields import FollowReferenceField
ret = {}
for fldname in self:
fld = self._fields.get(fldname)
is_list = isinstance(fld, db.ListField)
target = fld.field if is_list else fld
if all([
isinstance(
target, (db.ReferenceField, db.EmbeddedDocumentField)
), not isinstance(target, FollowReferenceField)
]):
value = None
if is_list:
value = []
for doc in getattr(self, fldname, []):
value.append(json.loads((
target.document_type.objects(
id=doc.id
).get() if isinstance(doc, DBRef) else doc
).to_json(
follow_reference=True,
max_depth=max_depth,
current_depth=current_depth + 1,
use_db_field=use_db_field,
*args, **kwargs
)))
else:
doc = getattr(self, fldname, None)
value = json.loads(
(
target.document_type.objects(
id=doc.id
).get() if isinstance(doc, DBRef) else doc
).to_json(
follow_reference=True,
max_depth=max_depth,
current_depth=current_depth + 1,
use_db_field=use_db_field,
*args, **kwargs
)
) if doc else doc
if value is not None:
ret.update({fldname: value})
return ret