一对多附加属性错误

one-to-many append attribute error

对 SQLAlchemy 有点菜鸟(和 Python,虽然不是那么多)。

似乎无法理顺我的 Post 和图片模型之间的关系。 Post 个对象应该有一个名为 'gallery' 的列表,一个相关图片对象的列表。还有一张 Post 'cover',一张单独的图片被选为图库封面。我也在尝试使用 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'))

我猜这是我配置两个模型之间多重关系的方式。帮我找出我遗漏的东西!

编辑:根据 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'))

您配置的关系不正确。您的 picture_ids 列不适用于一对多关系,因为您只能在该列中存储一个 picture_id。所以删除该列并使用它来设置画廊:

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

然后您可以从 Picture class 中删除 post_id 列,然后使用 Picture.post.

访问所有帖子