Hi,

I do not know if this is that I am missing something in how SQLAlchemy works or an issue; I have read the doc and searched for an explanation but could not find an answer.

When appending via an intermediate table,  a  M2M relationship behaves differently wether I use the back_populates argument or not ( or use backref)

* Without using back_populates or backref is works fine
```
from sqlalchemy import Column, Integer, String, ForeignKey, Table
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String(64))
    keywords = relationship("UsersKeywords")

    def __init__(self, name):
        self.name = name

class Keyword(Base):
    __tablename__ = 'keyword'
    id = Column(Integer, primary_key=True)
    keyword = Column('keyword', String(64))

    def __init__(self, keyword):
        self.keyword = keyword

class UsersKeywords(Base):
    __tablename__ = 'userskeywords'
    user_id = Column( Integer, ForeignKey("user.id"), primary_key=True)
    keyword_id = Column(Integer, ForeignKey("keyword.id"), primary_key=True)
    user = relationship(User, back_populates="keywords")
    keyword = relationship(Keyword)

>>>u = User(‘John’)
>>>u.keywords.append(Keyword(‘Python’)
>>>u.keywords
[<Keyword object at 0x10d09f860>]
```

* With back_populates or backref in one of the ‘M’ sides of the relation, ‘User’ in this case, I get a KeyError exception:
```
class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String(64))
    keywords = relationship('UsersKeywords', back_populates='user') # added back_populates argument

    def __init__(self, name):
        self.name = name

>>>u = User(‘John’)
>>>u.keywords.append(Keyword(‘Python’)

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Users/xxx/Development/python_ws/flask_env/lib/python3.6/site-packages/sqlalchemy/orm/collections.py", line 1044, in append
    item = __set(self, item, _sa_initiator)
  File "/Users/xxx/Development/python_ws/flask_env/lib/python3.6/site-packages/sqlalchemy/orm/collections.py", line 1016, in __set
    item = executor.fire_append_event(item, _sa_initiator)
  File "/Users/xxx/Development/python_ws/flask_env/lib/python3.6/site-packages/sqlalchemy/orm/collections.py", line 680, in fire_append_event
    item, initiator)
  File "/Users/xxx/Development/python_ws/flask_env/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 943, in fire_append_event
    state, value, initiator or self._append_token)
  File "/Users/xxx/Development/python_ws/flask_env/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 1210, in emit_backref_from_collection_append_event
    child_impl = child_state.manager[key].impl
KeyError: 'user'
```

Why is the behavior different?

Thanks in advance

Juan

[SQLAlchemy version: 1.2.9]

--
SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to