Hello!

>From reading the docs, I assumed that using "backref" on the child's
orm.relation declaration in a 1:n relationship is equivalent to using
"back_populates" with explicit orm.relation declarations on both ends.
However, it turns out that I get double insertions when using
back_populates - so, in the following code

p = Parent('parent1')
c = Child('child1')
c.parent = p
p.children.append(c)

p's children will contain c *twice*. Is this a bug, or am I reading
the docs wrong?

I'm grateful for any insights in this matter,

Oliver

=============
Class definitions:

class Child(object):
    def __init__(self, name):
        self.name = name
        self.id = None
        self.parent = None

class Parent(object):
    def __init__(self, name):
        self.name = name
        self.id = None
        self.children = []


Table definitions:

parent_table = sa.Table('parent', metadata,
                       sa.Column('parent_id', sa.types.Integer,
                                 primary_key=True),
                       sa.Column('parent_name', sa.types.String,
                                 nullable=False),
                       )

child_table = sa.Table('child', metadata,
                       sa.Column('child_id', sa.types.Integer,
                                 primary_key=True),
                       sa.Column('child_name', sa.types.String,
                                 nullable=False),
                       sa.Column('parent_id', sa.types.Integer,
                                 sa.ForeignKey
(parent_table.c.parent_id),
                                 nullable=False),
                       )

Mappers using backref:

orm.mapper(Parent, parent_table,
           properties=
                dict(name=orm.synonym('parent_name'),
                     id=orm.synonym('parent_id'),
                     )
           )
orm.mapper(Child, child_table,
           properties=
                dict(parent=orm.relation(Parent,
                                         uselist=False,
                                         backref='parent'
                                         ),
                     name=orm.synonym('child_name'),
                     id=orm.synonym('child_id')
                     )
           )

Mappers using back_populates:

orm.mapper(Parent, parent_table,
           properties=
                dict(name=orm.synonym('parent_name'),
                     id=orm.synonym('parent_id'),
                     children=orm.relation(Child,
                                           back_populates='parent',
                                           ),
                     )
           )
orm.mapper(Child, child_table,
           properties=
                dict(parent=orm.relation(Parent,
                                         uselist=False,
                                         back_populates='children',
                                         ),
                     name=orm.synonym('child_name'),
                     id=orm.synonym('child_id')
                     )
           )

--~--~---------~--~----~------------~-------~--~----~
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