Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error on appending to SQLAlchemy List

Please note this is not a copy of the this issue

I'm simply trying to add to a list that is defined in a one_to_many relationship in my model as below. Here's my model:

class TrustmileDelivery(db.Model, UniqueMixin, TableColumnsBase):
    __tablename__ = 'trustmile_delivery'

    articles = one_to_many('Article', backref='delivery', lazy='select')
    # Problem with this is getting a cascade error
    neighbour = many_to_one('ConsumerUser', backref='trustmile_deliveries', lazy='select')
    courier_user = many_to_one('CourierUser', backref='deliveries', lazy='select')
    state = db.Column(db.String(255), )

And when I try to create via:

 @classmethod
    def create(cls, user, articles):
        return TrustmileDelivery(user, articles)

with the init(..) function being:

def __init__(self, courier_user, articles):
    self.courier_user = courier_user
    if len(articles):
        self.articles.append(articles)

I get the following stack trace:

Traceback (most recent call last):
  File "/Users/james/Documents/workspace/trustmile-backend/trustmile/tests/test_deliveries.py", line 66, in test_create_trustmile_delivery
    tm_delivery = TrustmileDelivery.create(courier_user, articles)
  File "/Users/james/Documents/workspace/trustmile-backend/trustmile/app/deliveries/model.py", line 419, in create
    return TrustmileDelivery(user, articles)
  File "<string>", line 4, in __init__
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/orm/state.py", line 306, in _initialize_instance
    manager.dispatch.init_failure(self, args, kwargs)
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 60, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/orm/state.py", line 303, in _initialize_instance
    return manager.original_init(*mixed[1:], **kwargs)
  File "/Users/james/Documents/workspace/trustmile-backend/trustmile/app/deliveries/model.py", line 408, in __init__
    self.articles.append(articles)
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/orm/collections.py", line 1072, in append
    item = __set(self, item, _sa_initiator)
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/orm/collections.py", line 1044, in __set
    item = executor.fire_append_event(item, _sa_initiator)
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/orm/collections.py", line 716, in fire_append_event
    item, initiator)
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 936, in fire_append_event
    initiator or self._append_token or self._init_append_token())
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 42, in append
    item_state = attributes.instance_state(item)
AttributeError: 'list' object has no attribute '_sa_instance_state'
like image 817
silverdagger Avatar asked Jan 07 '16 12:01

silverdagger


1 Answers

As @van said, was simply a brain snap and answer was use self.articles.extend(articles) instead of self.articles.append(articles).

like image 103
silverdagger Avatar answered Oct 13 '22 00:10

silverdagger