class_docstr: Base class for dynamic documents that are embedded within other
  documents and therefore aren't stored in their own collection in the
  database.
  
  Dynamic documents can have arbitrary fields added to them.
class_docstr_tok: ["Base","class","for","dynamic","documents","that","are","embedded","within","other","documents","and","therefore","are","n't","stored","in","their","own","collection","in","the","database",".","Dynamic","documents","can","have","arbitrary","fields","added","to","them","."]
code: def _get_field(self, field_name):
      # pylint: disable=no-member
      chunks = field_name.split(".", 1)
      if len(chunks) > 1:
          field = self._fields.get(chunks[0], None)
          if field is None:
              field = self._dynamic_fields.get(chunks[0], None)
  
          if field is not None:
              field = field.get_field(chunks[1])
      else:
          field = self._fields.get(field_name, None)
          if field is None:
              field = self._dynamic_fields.get(field_name, None)
  
      if field is None:
          raise AttributeError(
              "%s has no field '%s'"
              % (self.__class__.__name__, field_name)
          )
  
      return field
  
file_path: fiftyone/fiftyone/core/odm/embedded_document.py
imports: import mongoengine
  from .document import DynamicMixin, MongoEngineBaseDocument
label_desc: Use image node_id 2 for calling the DynamicEmbeddedDocument obj's underlying member method code with example usage: obj._get_field(field_name) and returns: field