Thank you so much! I'll let you know!
P.S.: just create the m2m table for the relationship as needed. ... and this is another evidence that my brain is not 100% functional... Why didn't it occur to me? I dunno... 2011/3/23 Michael Bayer <mike...@zzzcomputing.com>: > > On Mar 23, 2011, at 5:47 PM, Hector Blanco wrote: > >> Hello everyone. >> >> >> class BaseClass(object): >> sqlRelationships_accelerator = None >> internalAttrs_accelerator = None >> properties_accelerator = None >> >> _id = Column("id", Integer, primary_key=True, key="id") >> >> @classmethod >> def intermediate_allowed_user_groups_to_this(cls): >> retval = None >> try: >> mapper = class_mapper(cls) >> except ormExc.UnmappedClassError: >> mapper = None >> >> if mapper and (mapper.local_table is not None): >> try: >> retval = getattr(Tables, >> >> ("intermediate_allowed_user_groups_to_%s" >> % mapper.local_table.name)) >> except KeyError: >> return None >> return retval >> >> @declared_attr >> def _allowedUserGroups(cls): >> if cls: >> intermediateTable = >> cls.intermediate_allowed_user_groups_to_this() >> if intermediateTable is not None: >> return relationship("UserGroup", >> secondary="intermediateTable", >> primaryjoin="%s._id == >> intermediateTable.elementId" % cls.__name__, >> secondaryjoin="UserGroup._id == >> intermediateTable.userGroupId", >> collection_class=set >> ) >> return None > > there's an enormous amount of complexity here for me to gather, its not > runnable either, which basically means I'm going to skip it. In particular > the whole digging into mappers and finding tables seems unnecessary, just > create the m2m table for the relationship as needed. > > For the general case of "everyone has a many-to-many to X", a short example > is attached. I hope to blog more about this kind of thing as an updated > approach to that discussed in the old Polymorphic Associations post. > > > > > > > > > >> >> def __hash__(self): >> return int(self.id) >> >> def setId(self, id): >> """Set id""" >> self._id = int(id) >> >> def getId(self): >> """Get id""" >> return self._id >> >> def setAllowedUserGroups(self, allowedUserGroups): >> self._allowedUserGroups = set(allowedUserGroups) >> >> def getAllowedUserGroups(self): >> return self._allowedUserGroups >> >> @declared_attr >> def allowedUserGroups(cls): >> return synonym('_allowedUserGroups', >> descriptor=property(cls.getAllowedUserGroups, >> cls.setAllowedUserGroups)) >> ---------------------------------------- >> >> The "intermediate_allowed_user_groups_to_this" classmethod tries to >> grab the intermediate table from the Tables module based on the name >> of the table where the actual instances of the class (descending from >> BaseClass) are going to be stored. Going back to the Store class, the >> __tablename__ is "stores". The >> intermediate_allowed_user_groups_to_this method will try to grab a >> table called "intermediate_allowed_user_groups_to_stores" (because >> that is the intermediate table that would link UserGroups and Stores) >> >> * What I wanted to achieve: >> To filter by userGroup, I just wanted to need adding an intermediate >> table to the Tables module relating the UserGroup with the class to >> filter (as I explained, if I wanted to filter "Store", which is stored >> in the table >> "stores", I just need to create a table called >> "intermediate_allowed_user_groups_to_stores", or if I wanted to filter >> "Foo", stored in the "foos" table, I would just need to create >> "intermediate_allowed_user_groups_to_foos" and the baseclass, with its >> declared_attribute relationship, helped by the >> "intermediate_allowed_user_groups_to_this" would take care of the >> rest. >> >> What I got: >> >> Traceback (most recent call last): >> File "/home/ae/ev-cms/server/src/server/app.py", line 30, in __init__ >> SetupDB.setupDB() >> File "/home/ae/ev-cms/backlib/database/SetupDB.py", line 26, in setupDB >> populateWithSamples() >> File "/home/ae/ev-cms/backlib/database/SetupDB.py", line 86, in >> populateWithSamples >> samples = Store.Store.getSamples() >> File "/home/ae/ev-cms/backlib/store/Store.py", line 379, in getSamples >> store = cls() >> File "<string>", line 4, in __init__ >> File >> "/home/ae/.buildout/eggs/SQLAlchemy-0.6.6-py2.6.egg/sqlalchemy/orm/state.py", >> line 111, in initialize_instance >> return manager.events.original_init(*mixed[1:], **kwargs) >> File "/home/ae/ev-cms/backlib/store/Store.py", line 73, in __init__ >> self.allowedUserGroups = set() >> File >> "/home/ae/.buildout/eggs/SQLAlchemy-0.6.6-py2.6.egg/sqlalchemy/orm/attributes.py", >> line 210, in __set__ >> return descriptor.__set__(instance, value) >> File "/home/ae/ev-cms/backlib/database/BaseClass.py", line 80, in >> setAllowedUserGroups >> self._allowedUserGroups = set(allowedUserGroups) >> AttributeError: can't set attribute >> >> >> ... it didn't even get pass the Store.Store constructor... :-D >> >> class Store(BaseClass.BaseClass, declarative_base) >> def __init__(self): >> super(Store, self).__init__() >> self.name = "" >> self.allowedUserGroups = set() # Crack! >> >> If I remove the line self.allowedUserGroups = set() from the >> constructor, I get this: >> File "/home/ae/ev-cms/backlib/database/BaseClass.py", line 86, in >> addAllowedUserGroup >> self.allowedUserGroups.add(userGroup) >> AttributeError: 'RelationshipProperty' object has no attribute 'add' >> >> I guess is not that easy... :-) >> >> I'm sure it's doable... but I don't know how... Any hint will be appreciated. >> >> As usual, thank you in advance >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sqlalchemy" group. >> To post to this group, send email to sqlalchemy@googlegroups.com. >> To unsubscribe from this group, send email to >> sqlalchemy+unsubscr...@googlegroups.com. >> For more options, visit this group at >> http://groups.google.com/group/sqlalchemy?hl=en. >> > > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalchemy@googlegroups.com. > To unsubscribe from this group, send email to > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. > > > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.