繁体   English   中英

Flask SQLAlchemy 按字段值和外键关系过滤记录

[英]Flask SQLAlchemy filter records by a field value and a foreign key relationship

刚开始使用 SQLAlchemy 和 flask,我不知道如何编写这个查询。 我使用的模型:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(20), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)
    role = db.Column(db.String(5), nullable=False, default='user')
    # This field represents the many files one user can have
    files = db.relationship('Files', backref='owner', lazy=True)

    def __repr__(self):
        return f"User('{self.username}', '{self.email}', '{self.password}', '{self.role}', '{self.files}')"

class Files(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    filename = db.Column(db.String(40), unique=True, nullable=False)
    date_modified = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    owner_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    def __repr__(self):
        return f"Files('{self.filename}', '{self.owner_id}', '{self.date_modified}')"

解释:用户与他拥有的许多文件具有一对多关系。

所以我拥有的是用户名文件名,我正在尝试提取具有匹配文件名的特定用户文件。

许多用户 --> 单个用户 --> 用户的文件 --> 具有我需要的特定名称的文件。

我试图找到一个解决方案,但对所有不同的功能和查询方式感到不知所措。

我已经尝试过的是获取具有特定文件名的所有文件,假设文件名字段是唯一的。 但即使这样也没有用:

requested_file = User.query.join(Files).filter(Files.filename == searched_filename).first()
AttributeError: 'NoneType' object has no attribute 'filename'

我将不胜感激

尝试这个:

requested_files = Files.query.filter_by(filename==searched_filename, owner_id=user_id).all()

不要搞砸了,改变你的

files = db.relationship('Files', backref='owner', lazy=True)

owner_id= db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

进入

files = db.relationship('Files', backref='user', lazy=True)

user_id= db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

同时,错误AttributeError: 'NoneType' object has no attribute 'filename'是因为您的 Files 表中没有Files因为您已经加入Files 确保您使用 model 进行了迁移,并且 db 中有数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM