I was exploring the association proxy example in the documentation and
then explored the use of a mapped collection as the custom collection
class with mixed results.  When attempting to "append", an
AttributeError _AssociationDict object has no attribute append
occurred.  Then, I tried subclassing MappedCollection, created my own
append method and have SQLAlchemy instrument it but the results were
the same.  Here's the code I was testing it with:

from sqlalchemy import Boolean, Column, ForeignKey, Integer, String,
Table
from sqlalchemy.orm import relation
from sqlalchemy.orm.collections import mapped_collection,
MappedCollection, collection
from sqlalchemy.ext.associationproxy import association_proxy
from turbogears.database import metadata, session

users_table = Table('users', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String(64))
)

keywords_table = Table('keywords', metadata,
    Column('id', Integer, primary_key=True),
    Column('keyword', String(64))
)

userkeywords_table = Table('userkeywords', metadata,
    Column('user_id', Integer, ForeignKey("users.id"),
primary_key=True),
    Column('keyword_id', Integer, ForeignKey("keywords.id"),
primary_key=True)
)

def _create_uk(keyword):
    return UserKeyword(keyword=keyword)

class User(object):
    def __init__(self, id, name):
        self.id = id
        self.name = name
    keywords = association_proxy('user_keywords', 'keyword',
creator=_create_uk)

class Keyword(object):
    def __init__(self, id, keyword):
        self.id = id
        self.keyword = keyword
    def __repr__(self):
        return 'Keyword(%s)' % repr(self.keyword)

class UserKeyword(object):
    def __init__(self, user=None, keyword=None):
        self.user = user
        self.keyword = keyword

session.mapper(Keyword, keywords_table)
session.mapper(User, users_table, properties={
    'user_keywords':relation(UserKeyword)
})
session.mapper(UserKeyword, userkeywords_table, properties={
    'user':relation(User),
    'keyword':relation(Keyword)
})

user = User('1', 'number')
kw1 = Keyword('0', 'zero')
user.user_keywords.append(UserKeyword(user, kw1))

for kw in (Keyword('1', 'one'), Keyword('2', 'two'), Keyword('3',
'three')):
    user.keywords.append(kw)


Portion of code changed with mapped collection (which won't work):
session.mapper(User, users_table, properties={
    #'user_keywords':relation(UserKeyword)
    'user_keywords':relation(UserKeyword,
collection_class=mapped_collection(lambda item: item.keyword.id))
})


Code for customized collection (also won't work):
class MyCollection(MappedCollection):
    def __init__(self, keyfunc=lambda item: item.id):
        MappedCollection.__init__(self, keyfunc=keyfunc)

    @collection.appender
    def append(self, item):
        MappedCollection.set(self, item)

    @collection.remover
    def remove(self, item):
        MappedCollection.remove(self, item)

u_collection = lambda: MyCollection(keyfunc=lambda item:
item.keyword.id)
session.mapper(User, users_table, properties={
    #'user_keywords':relation(UserKeyword)
    'user_keywords':relation(UserKeyword,
collection_class=u_collection)
})
--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to