Excellent, thank you. A few minutes after I posted I was able to
figure out the NewsOrg.__init__ method fix, but the creator lambda
argument to association_proxy is much cleaner. Thanks again!

On Nov 13, 2:45 pm, Conor <conor.edward.da...@gmail.com> wrote:
> Matthew R wrote:
> > Hello,
>
> > Just getting started with association proxy and having trouble making
> > it work. The lookups seem to work fine but when I try to add a new
> > element to the association, I get "TypeError: __init__() takes exactly
> > 1 argument (2 given)". Code & test case below, I've left a bunch of
> > columns out for brevity:
>
> > from sqlalchemy import Column, Integer, String, DateTime, Boolean,
> > ForeignKey, Text, Date
> > from sqlalchemy.ext.declarative import declarative_base
> > from sqlalchemy.orm import relation, backref
> > from sqlalchemy.ext.associationproxy import association_proxy
>
> > Base = declarative_base()
>
> > class Org(Base):
> >     __tablename__ = 'tOrg'
>
> >     id = Column(Integer, primary_key=True, name='OrgID')
> >     name = Column(String(100), name='OrgName')
>
> >     def __repr__(self):
> >         return "<Org(%s: '%s')>" % (self.id, self.name,)
>
> > class News(Base):
> >     __tablename__ = 'tNews'
>
> >     id = Column(Integer, primary_key=True, name='NewsID')
> >     title = Column(String(255), name='NewsTitle')
> >     body = Column(Text, name='NewsBody')
> >     author = Column(String(255), name='NewsAuthor')
> >     is_active = Column(Boolean, name='NewsActive')
> >     date = Column(Date, name='NewsDate')
> >     priority = Column(Integer, name='NewsPriority')
>
> >     orgs = association_proxy('newsorgs', 'org')
>
> >     def __repr__(self):
> >         return "<News(%s: '%s')>" % (self.id, self.title,)
>
> > class NewsOrg(Base):
> >     __tablename__ = 'trefNewsOrg'
>
> >     id = Column(Integer, primary_key=True, name='NewsOrgID')
> >     news_id = Column(Integer, ForeignKey(News.id), name='NewsID')
> >     news = relation('News', backref=backref('newsorgs'))
>
> >     org_id = Column(Integer, ForeignKey(Org.id), name='OrgID')
> >     org = relation(Org)
>
> >     def __repr__(self):
> >         if self.org:
> >             orgname = self.org.name
> >         else:
> >             orgname = 'ALL'
> >         return "<NewsOrg(%s: '%s', (%s))>" % (self.id,
> > self.news.title, orgname,)
>
> > def testcase(session):
> >     myorg = session.query(Org).filter(Org.id==6).one()
> >     otherorg_news_associations = session.query(NewsOrg).filter
> > (NewsOrg.org_id==1).all()
> >     mystory = otherorg_news_associations[0].news
> >     mystory.orgs.append(myorg) # <-- TypeError: __init__() takes
> > exactly 1 argument (2 given)
> >     session.commit()
>
> The association_proxy is trying to create the NewsOrg object by calling
> NewsOrg(myorg). Since your NewsOrg class does not override __init__, the
> default declarative __init__ is used, which takes only keyword
> arguments. This causes the "TypeError: __init__() takes exactly 1
> argument (2 given)" error.
>
> You can fix this by either adding an __init__ method to NewsOrg like this:
> def __init__(self, org=None, **kwargs):
>     super(NewsOrg, self).__init__(**kwargs)
>     self.org = org
>
> or, preferably, add a creator argument to association_proxy:
> orgs = association_proxy('newsorgs', 'org', creator=lambda org:
> NewsOrg(org=org))
>
> You can find out more about the 'creator' argument 
> at:http://www.sqlalchemy.org/docs/05/reference/ext/associationproxy.html...
>
> -Conor
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to