I think you may be confused about the relationship properties you have
here. As far as I can tell, a Creator can have many companies, but
each Company has only one creator, correct? So Company.creator should
only ever be an instance of Creator (or None), whereas
Creator.companies should be a list.

In your __repr__ example:

class Creator(Base):
    def __repr__(self):
        return '%s' % self.creator

class Company(Base):
    def __repr__(self):
        return '%s, created by %s' % (self.company, self.creator[0])

Why are you using "self.creator[0]" here? self.creator is not a list,
it should either be an instance of Creator, or None.

Overriding __repr__ is also a good way to make debugging difficult.
For example, if you had a list of Creator instances and you printed
them at the python prompt, it would just look like a list of strings.
When I want extra information from __repr__, I normally write it
something like this:

def __repr__(self):
    classname = type(self).__name__
    return '<%s name=%r>' % (classname, self.name)

In your second example:

>>> a=session.query(Creator).first()
>>> a[0].companies
>>> a.companies

Query.first() returns a single value, not a list. So typing "a[0]"
doesn't make any sense.

Please try to create a self-contained script that demonstrates your
problem. Here is a good example:

https://groups.google.com/d/msg/sqlalchemy/jQtIRJXVfH8/LgwX-bomEIQJ

Thanks,

Simon

On Wed, Aug 14, 2013 at 2:45 AM,  <csdr...@gmail.com> wrote:
> I'm afraid there are still some bugs in here that hopefully you can help
> with.
>
> class Creator(Base):
>     __tablename__ = "creators"
>     id = Column(Integer, primary_key = True)
>     company_id = Column(Integer, ForeignKey('companies.id'))
>     creator = Column(String(100), nullable=False, unique=True)
>     def __init__(self, creator):
>         self.creator = creator
>     def __repr__(self):
>         return '%s' % self.creator # otherwise returns a single entry list
> for some reason (e.g. would display [user])
>
> class Company(Base):
>     __tablename__ = "companies"
>     id = Column(Integer, primary_key = True)
>     company = Column(String(100), unique=True, nullable=False) #might want
> to revise string sizes at some point
>     creator = relationship("Creator", backref="companies", cascade="all")
>     def __init__(self, company, creator):
>         self.company = company
>         #self.creator.append(Creator(creator))
>         existing_creator =
> session.query(Creator).filter_by(creator=creator).first()
>         #self.creator.append(existing_creator or Creator(creator))
>         if existing_creator:
>             print True
>             self.creator.append(existing_creator)
>         else:
>             self.creator.append(Creator(creator))
>     def __repr__(self):
>         return '%s, created by %s' % (self.company, self.creator[0])
>
>
>
> 1) Weird __repr__ error:
>
> class Creator(Base):
>     def __repr__(self):
>         return '%s' % self.creator
>
> class Company(Base):
>     def __repr__(self):
>         return '%s, created by %s' % (self.company, self.creator[0])
>
>>>> c=Company("Company1", "mike")
>>>> session.add(c)
>>>> c=Company("Company2", "mike")
> True
>>>> session.add(c)
>>>> c=Company("Company3", "john")
>>>> session.add(c)
>>>> c=Company("Company4", "mike")
> True
>>>> session.add(c)
>>>> session.query(Company).all()
> [Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "<stdin>", line 17, in __repr__
>
>
> However, if I divide the query lines among every add() statement, there is
> no __repr__ error.
>
>>>> c=Company("Company1", "mike")
>>>> session.add(c)
>>>> session.query(Company).all()
> [Company1, created by mike]
>>>> c=Company("Company2", "mike")
> True
>>>> session.add(c)
>>>> session.query(Company).all()
> [Company1, created by mike, Company2, created by mike]
>>>> c=Company("Company3", "john")
>>>> session.add(c)
>>>> session.query(Company).all()
> [Company1, created by mike, Company2, created by mike, Company3, created by
> john]
>>>> c=Company("Company4", "mike")
> True
>>>> session.add(c)
>>>> session.query(Company).all()
> [Company1, created by mike, Company2, created by mike, Company3, created by
> john, Company4, created by mike]
>
>
> 2) Creator.companies only shows the most recently added company:
>
>>>> session.query(Company).all()
> [Company1, created by mike, Company2, created by mike, Company3, created by
> john, Company4, created by mike]
>>>> session.query(Creator).all()
> [mike, john]
>>>> a=session.query(Creator).first()
>>>> a[0].companies
>>>> a.companies
> Company4, created by mike
>
>
> 3) Weird Company.creator error:
>
>>>> session.query(Company).all()
> [Company1, created by mike, Company2, created by mike, Company3, created by
> john, Company4, created by mike]
>>>> session.query(Company.creator).all()
> [(False,), (False,), (False,), (False,), (True,), (False,), (False,),
> (True,)]
>>>> a=session.query(Company).first()
>>>> a.creator
> [mike]
>
> Anyone have any ideas?
>
> --
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to