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'
是因为您的文件 table 中没有 Files
,因为您已经加入 Files
。确保你迁移了模型并且数据库中有数据。
刚开始将 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'
是因为您的文件 table 中没有 Files
,因为您已经加入 Files
。确保你迁移了模型并且数据库中有数据。