def get_field_info(model): """ Given a model class, returns a `FieldInfo` instance containing metadata about the various field types on the model. """ # Deal with the primary key. pk = model.id if not issubclass(model, mongoengine.EmbeddedDocument) else None # Deal with regular fields. fields = OrderedDict() for field_name in model._fields_ordered: fields[field_name] = model._fields[field_name] # Deal with forward relationships. # Pass forward relations since there is no relations on mongodb forward_relations = OrderedDict() # Deal with reverse relationships. # Pass reverse relations since there is no relations on mongodb reverse_relations = OrderedDict() # Shortcut that merges both regular fields and the pk, # for simplifying regular field lookup. fields_and_pk = OrderedDict() fields_and_pk["pk"] = pk fields_and_pk[getattr(pk, "name", "pk")] = pk fields_and_pk.update(fields) # Shortcut that merges both forward and reverse relationships relations = OrderedDict(list(forward_relations.items()) + list(reverse_relations.items())) return FieldInfo(pk, fields, forward_relations, reverse_relations, fields_and_pk, relations)
class BindingDict(object): """ This dict-like object is used to store fields on a serializer. This ensures that whenever fields are added to the serializer we call `field.bind()` so that the `field_name` and `parent` attributes can be set correctly. """ def __init__(self, serializer): self.serializer = serializer self.fields = OrderedDict() def __setitem__(self, key, field): self.fields[key] = field field.bind(field_name=key, parent=self.serializer) def __getitem__(self, key): return self.fields[key] def __delitem__(self, key): del self.fields[key] def items(self): return self.fields.items() def keys(self): return self.fields.keys() def values(self): return self.fields.values()
class BindingDict(object): """ This dict-like object is used to store fields on a serializer. This ensures that whenever fields are added to the serializer we call `field.bind()` so that the `field_name` and `parent` attributes can be set correctly. """ def __init__(self, serializer): self.serializer = serializer self.fields = OrderedDict() def __setitem__(self, key, field): self.fields[key] = field field.bind(field_name=key, parent=self.serializer) def __getitem__(self, key): return self.fields[key] def __delitem__(self, key): del self.fields[key] def items(self): return self.fields.items() def keys(self): return self.fields.keys() def values(self): return self.fields.values()
def get_field_info(model): """ Given a model class, returns a `FieldInfo` instance containing metadata about the various field types on the model. """ # Deal with the primary key. pk = model.id if not issubclass(model, mongoengine.EmbeddedDocument) else None # Deal with regular fields. fields = OrderedDict() for field_name in model._fields_ordered: fields[field_name] = model._fields[field_name] # Deal with forward relationships. # Pass forward relations since there is no relations on mongodb forward_relations = OrderedDict() # Deal with reverse relationships. # Pass reverse relations since there is no relations on mongodb reverse_relations = OrderedDict() # Shortcut that merges both regular fields and the pk, # for simplifying regular field lookup. fields_and_pk = OrderedDict() fields_and_pk['pk'] = pk fields_and_pk[getattr(pk, 'name', 'pk')] = pk fields_and_pk.update(fields) # Shortcut that merges both forward and reverse relationships relations = OrderedDict( list(forward_relations.items()) + list(reverse_relations.items()) ) return FieldInfo(pk, fields, forward_relations, reverse_relations, fields_and_pk, relations)
def get_field_info(model): """ Given a model class, returns a `FieldInfo` instance containing metadata about the various field types on the model. """ opts = model._meta.concrete_model._meta # Deal with the primary key. pk = opts.pk while pk.rel and pk.rel.parent_link: # If model is a child via multitable inheritance, use parent's pk. pk = pk.rel.to._meta.pk # Deal with regular fields. fields = OrderedDict() for field in [field for field in opts.fields if field.serialize and not field.rel]: fields[field.name] = field # Deal with forward relationships. forward_relations = OrderedDict() for field in [field for field in opts.fields if field.serialize and field.rel]: forward_relations[field.name] = RelationInfo( model_field=field, related=_resolve_model(field.rel.to), to_many=False, has_through_model=False ) # Deal with forward many-to-many relationships. for field in [field for field in opts.many_to_many if field.serialize]: forward_relations[field.name] = RelationInfo( model_field=field, related=_resolve_model(field.rel.to), to_many=True, has_through_model=( not field.rel.through._meta.auto_created ) ) # Deal with reverse relationships. reverse_relations = OrderedDict() for relation in opts.get_all_related_objects(): accessor_name = relation.get_accessor_name() reverse_relations[accessor_name] = RelationInfo( model_field=None, related=relation.model, to_many=relation.field.rel.multiple, has_through_model=False ) # Deal with reverse many-to-many relationships. for relation in opts.get_all_related_many_to_many_objects(): accessor_name = relation.get_accessor_name() reverse_relations[accessor_name] = RelationInfo( model_field=None, related=relation.model, to_many=True, has_through_model=( (getattr(relation.field.rel, 'through', None) is not None) and not relation.field.rel.through._meta.auto_created ) ) # Shortcut that merges both regular fields and the pk, # for simplifying regular field lookup. fields_and_pk = OrderedDict() fields_and_pk['pk'] = pk fields_and_pk[pk.name] = pk fields_and_pk.update(fields) # Shortcut that merges both forward and reverse relationships relations = OrderedDict( list(forward_relations.items()) + list(reverse_relations.items()) ) return FieldInfo(pk, fields, forward_relations, reverse_relations, fields_and_pk, relations)
def get_field_info(model): """ Given a model class, returns a `FieldInfo` instance containing metadata about the various field types on the model. """ opts = model._meta.concrete_model._meta # Deal with the primary key. pk = opts.pk while pk.rel and pk.rel.parent_link: # If model is a child via multitable inheritance, use parent's pk. pk = pk.rel.to._meta.pk # Deal with regular fields. fields = OrderedDict() for field in [field for field in opts.fields if field.serialize and not field.rel]: fields[field.name] = field # Deal with forward relationships. forward_relations = OrderedDict() for field in [field for field in opts.fields if field.serialize and field.rel]: forward_relations[field.name] = RelationInfo( model_field=field, related=_resolve_model(field.rel.to), to_many=False, has_through_model=False ) # Deal with forward many-to-many relationships. for field in [field for field in opts.many_to_many if field.serialize]: forward_relations[field.name] = RelationInfo( model_field=field, related=_resolve_model(field.rel.to), to_many=True, has_through_model=( not field.rel.through._meta.auto_created ) ) # Deal with reverse relationships. reverse_relations = OrderedDict() for relation in opts.get_all_related_objects(): accessor_name = relation.get_accessor_name() reverse_relations[accessor_name] = RelationInfo( model_field=None, related=relation.model, to_many=relation.field.rel.multiple, has_through_model=False ) # Deal with reverse many-to-many relationships. for relation in opts.get_all_related_many_to_many_objects(): accessor_name = relation.get_accessor_name() reverse_relations[accessor_name] = RelationInfo( model_field=None, related=relation.model, to_many=True, has_through_model=( (getattr(relation.field.rel, 'through', None) is not None) and not relation.field.rel.through._meta.auto_created ) ) # Shortcut that merges both regular fields and the pk, # for simplifying regular field lookup. fields_and_pk = OrderedDict() fields_and_pk['pk'] = pk fields_and_pk[pk.name] = pk fields_and_pk.update(fields) # Shortcut that merges both forward and reverse relationships relations = OrderedDict( list(forward_relations.items()) + list(reverse_relations.items()) ) return FieldInfo(pk, fields, forward_relations, reverse_relations, fields_and_pk, relations)