def __property_config__(self, model_class, property_name): super(ReferenceListProperty, self).__property_config__(model_class, property_name) if self.collection_name is None: self.collection_name = '%s_listref_set' % (model_class.__name__.lower()) if hasattr(self.reference_class, self.collection_name): raise DuplicatePropertyError('Class %s already has property %s' % (self.reference_class.__name__, self.collection_name)) setattr(self.reference_class, self.collection_name, _ReverseReferenceProperty(model_class, property_name))
def __property_config__(self, model_class, property_name): """Loads all of the references that point to this model. We need to do this to create the ReverseReferenceProperty properties for this model and create the <reference>_set attributes on the referenced model, e.g.: class Story(db.Model): title = db.StringProperty() class Comment(db.Model): story = db.ReferenceProperty(Story) story = Story.get(id) print [c for c in story.comment_set] In this example, the comment_set property was created based on the reference from Comment to Story (which is inherently one to many). Args: model_class: Model class which will have its reference properties initialized. property_name: Name of property being configured. Raises: DuplicatePropertyError if referenced class already has the provided collection name as a property. """ super(MemcacheReferenceProperty, self).__property_config__(model_class, property_name) if self.reference_class is _SELF_REFERENCE: self.reference_class = self.data_type = model_class if self.collection_name is None: self.collection_name = '%s_set' % (model_class.__name__.lower()) existing_prop = getattr(self.reference_class, self.collection_name, None) if existing_prop is not None: if not (isinstance(existing_prop, db._ReverseReferenceProperty) and existing_prop._prop_name == property_name and existing_prop._model.__name__ == model_class.__name__ and existing_prop._model.__module__ == model_class.__module__): raise DuplicatePropertyError('Class %s already has property %s ' % (self.reference_class.__name__, self.collection_name)) setattr(self.reference_class, self.collection_name, db._ReverseReferenceProperty(model_class, property_name))
def __property_config__(self, model_class, property_name): ''' Adds the normal and reverse collections to the model Args: model_class: Model class which will have its reference properties initialized. property_name: Name of property being configured. Raises: DuplicatePropertyError if referenced class already has the provided collection name as a property. ''' super(ReferenceListProperty, self).__property_config__(model_class, property_name) #set up (forward) collection if self.collection_name is None: self.collection_name = '%s_set' % ( self.reference_class.__name__.lower()) existing_prop = getattr(self.model_class, self.collection_name, None) if existing_prop is not None: if not(isinstance(existing_prop, db._ReverseReferenceProperty) and existing_prop._prop_name == property_name and existing_prop._model.__name__ == self.reference_class.__name__ and existing_prop._model.__module__ == self.reference_class.__module__): raise db.DuplicatePropertyError( 'Class %s already has property %s ' % ( self.model_class.__name__, self.collection_name)) #create and attach forward collection setattr(self.model_class, self.collection_name, _ForwardReferenceProperty(self.reference_class, property_name)) #Set up Reverse Collection if self.reverse_collection_name is None: self.reverse_collection_name = '%s_set' % ( model_class.__name__.lower()) #check for duplicate reverse_collection_name existing_prop = getattr(self.reference_class, self.reverse_collection_name, None) if existing_prop is not None: if not (isinstance(existing_prop, db._ReverseReferenceProperty) and existing_prop._prop_name == property_name and existing_prop._model.__name__ == model_class.__name__ and existing_prop._model.__module__ == model_class.__module__): raise db.DuplicatePropertyError( 'Class %s already has property %s ' % (self.reference_class.__name__, self.reverse_collection_name)) #create and attach reverse collection setattr(self.reference_class, self.reverse_collection_name, db._ReverseReferenceProperty(model_class, property_name))