![](/img/trans.png)
[英]Flask SQLAlchemy query: filter records from self foreign key relationship
[英]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.