I assume a getset_factory is needed for the association proxy. Any
examples?
On Feb 21, 8:38 am, Ronald Lew [EMAIL PROTECTED] wrote:
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
-~--~~~~--~~--~--~---