一对多附加属性错误
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
.
访问所有帖子
对 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
.