2015-02-11 4 views
0

Бит noob с SQLAlchemy (и Python, хотя и менее).ошибка атрибута атрибута «один ко многим»

Невозможно разобрать отношения между моделями Post и Picture. Почтовые объекты должны иметь список под названием «галерея», список связанных объектов изображения. Также есть «обложка» «Почта», отдельное изображение, выбранное в качестве обложки галереи. Я также пытаюсь использовать OrderingList для сохранения порядка картинок в галерее.

При попытке добавить фотографии к post.gallery на мой взгляд он бросает следующее:

AttributeError: 'NoneType' object has no attribute 'append' 

Вот модели:

class Post(db.Model): 
    __tablename__ = 'posts' 
    id = db.Column(db.Integer, primary_key=True) 
    cover_id = db.Column(db.Integer, db.ForeignKey('pictures.id', 
      use_alter=True, name='fk_post_cover_id')) 
    picture_ids = db.Column(db.Integer, db.ForeignKey('pictures.id', 
      use_alter=True, name='fk_post_picture_ids')) 
    cover = db.relationship('Picture', foreign_keys=cover_id, post_update=True) 
    gallery = db.relationship('Picture', foreign_keys=picture_ids, 
      order_by='Picture.position', 
      collection_class=ordering_list('position')) 

class Picture(db.Model): 
    __tablename__ = 'pictures' 
    id = db.Column(db.Integer, primary_key=True) 
    position = db.Column(db.Integer) 
    post_id = db.Column(db.Integer, db.ForeignKey('posts.id')) 

Я предполагаю, что это так, я настроил множественная связь между двумя моделями. Помогите мне определить, что мне не хватает!

EDIT: Согласно предложению badAPI, picture_ids будет содержать только одно значение, а не список значений. Следующие изменения в моих моделях создавали рабочее отношение «один ко многим»:

class Post(db.Model): 
__tablename__ = 'posts' 
    id = db.Column(db.Integer, primary_key=True) 
    user_id = db.Column(db.Integer, db.ForeignKey('users.id')) 
    cover_id = db.Column(db.Integer, db.ForeignKey('pictures.id', 
      use_alter=True, name='fk_post_cover_id')) 
    cover = db.relationship('Picture', uselist=False, foreign_keys=cover_id, 
      post_update=True) 

class Picture(db.Model): 
    __tablename__ = 'pictures' 
    id = db.Column(db.Integer, primary_key=True) 
    position = db.Column(db.Integer) 
    post_id = db.Column(db.Integer, db.ForeignKey('posts.id')) 

    gallery = db.relationship('Post', foreign_keys=post_id, 
      order_by='Picture.position', 
      collection_class=ordering_list(position), 
      backref=db.backref('gallery')) 

ответ

0

Вы неправильно настроили отношение. Ваш столбец picture_ids не будет работать для отношений друг к другу, поскольку вы можете хранить только один файл изображения в этом столбце. Так удалите этот столбец и использовать это, чтобы создать галерею:

gallery = db.relationship('Picture', backref=db.backref('post', uselist=False)) 

Затем вы можете удалить post_id столбец из Picture класса и просто получить доступ всех сообщений с помощью Picture.post.

+0

По-прежнему бросает ту же ошибку. Разве это не «справочник» для установления отношений «один к одному»? Мне нужна «галерея», чтобы быть списком фотографий, связанных с сообщением. –

+0

'uselist = False' установлен на backref, так как каждое изображение принадлежит только одному сообщению. Вы пытались удалить другие kwargs, такие как 'collection_class',' order_by' и 'foreign_keys', чтобы узнать, какая из них вызывает проблему? – badAPI

+0

Спасибо, что нашли время, чтобы посмотреть на это. Я удалил 'picture_ids' и использовал вашу версию' gallery', так что никаких других kwargs, как вы предложили, все равно такая же ошибка. Разве вы не хотели добавить свою версию модели «галерея» в «Фото»? –

Смежные вопросы