SQLAlchemy:如何从其他模型继承数据并将其设置为默认值?

时间:2018-03-26 05:54:49

标签: python flask sqlalchemy

我还不习惯SQLAlchemy,所以这可能是一个愚蠢的问题。 我正在尝试使用FlaskSQLAlchemy首次制作网络应用。 我想要做的是从其他模型继承数据并将其设置为默认值。

我在做什么就是这样

class User(UserMixin, db.Model):
    username = db.Column(db.String(64), index=True, unique=True)
    upload_photo = db.relationship('Photo', backref='user')

class Photo(db.Model):
        uploader_name = db.Column(db.String(64), db.ForeignKey('user.username'))

所以我想将上传照片的用户名设置为uploader_name。 但是当我提到uploder_name时,它总是'None'。 也许我误解了关系和ForeignKeys。 我怎样才能解决这个问题?还请告诉我我的方式有多错,以及如何正确使用关系。

感谢您的回复。但是输出仍然是相同的,即使我改变了答案。我在做什么就是这样 实际上我想在网页上显示它,但即使可以提及其他内容,我也无法推荐。

    photos = Photo.query.with_entities(Photo.name, Photo.image, Photo.user).all()
    return render_template('index.html', title='Home', photos=photos)

和HTML就像这样

    {% for photo in photos %}
            {{ photo.user.username }}
    {% endfor %}

为此,它没有显示任何内容,当我将其更改为{{ photo.user }}时,它显示None

我以示例的方式显示模型部分

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    photos = db.relationship('Photo', back_populates='user')

class Photo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = db.relationship('User', back_populates='photos')

我检查了它在解释器上是如何工作的,但它是一样的。

1 个答案:

答案 0 :(得分:1)

您应该使用关系(在这种情况下,One-To-Many):

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(64), index=True, unique=True)
    photos = db.relationship('Photo', back_populates = 'user')


class Photo(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = db.relationship('User', back_populates = 'photos')

然后你可以在两边访问这些对象:

user = User.query.filter_by(id = 1).first()
user.photos #  Outputs all photos with user_id set to this user

photo = Photo.query.filter_by(id = 1).first()
photo.user #  Outputs the user of a certain photo

您可以通过不同方式将照片添加到使用中,最直接的方法是:

user = User.query.filter_by(id = 1).first()
new_photo = Photo() 
user.photos.append(new_photo)
db.session.commit()