flask - 多对多 - 基于额外关联字段的关联对象查询
问题描述
我有一个多对多关联对象关系。关联对象有一个额外的时间戳字段。这个想法是仅在关联的时间戳在特定时间范围内时才返回关联的关系。
模型.py
from rvt import db
from sqlalchemy_utils import IPAddressType
class ReportAssociation(db.Model):
id = db.Column(db.Integer, primary_key=True)
entity_id = db.Column(db.Integer, db.ForeignKey('entity.id'))
report_id = db.Column(db.Integer, db.ForeignKey('report_map.id'))
timestamp = db.Column(db.DateTime)
report_map = db.relationship('ReportMap', back_populates='entities')
entity = db.relationship('Entity', back_populates='report_maps')
__table_args__ = (
db.UniqueConstraint('entity_id', 'report_id', 'timestamp'),
)
def __repr__(self):
return f'ReportAssociation: {self.entity} {self.report_map} - {self.timestamp}'
class Entity(db.Model):
id = db.Column(db.Integer, primary_key=True)
ip_address = db.Column(IPAddressType, unique=True, nullable=False)
hostname = db.Column(db.String(64), index=True, nullable=True)
region = db.Column(db.String(32), index=True, nullable=True)
geo = db.Column(db.String(32), index=True, nullable=True)
city = db.Column(db.String(32), index=True, nullable=True)
asn = db.Column(db.String(8), index=True, nullable=True)
subnet_desc = db.Column(db.String(256), index=True, nullable=True)
report_maps = db.relationship('ReportAssociation', back_populates='entity', lazy="dynamic")
timestamp = db.Column(db.DateTime)
def __repr__(self):
return f'<Entity {self.ip_address}>'
class ReportMap(db.Model):
id = db.Column(db.Integer, primary_key=True)
pattern = db.Column(db.String(64), nullable=False, unique=True)
name = db.Column(db.String(32), nullable=False, unique=True)
short_name = db.Column(db.String(32), nullable=False, unique=True)
wiki_url = db.Column(db.String(128), nullable=True, unique=False)
entities = db.relationship('ReportAssociation', back_populates='report_map', lazy="dynamic")
def __repr__(self):
return f'<ReportMap {self.name}>'
我遇到的问题是查询。以下作品。
>>> e = Entity.query.one()
>>> e
<Entity 101.98.10.156>
>>> for i in e.report_maps.all():
... print(i.timestamp)
...
2019-04-02 21:15:49.985126
2019-04-02 21:15:59.028121
>>> for i in e.report_maps.filter_by(timestamp='2019-04-02 21:15:59.028121'):
... print(i.timestamp)
...
2019-04-02 21:15:59.028121
当我尝试使用类似下面的东西时,问题就出现了
>>> for i in e.report_maps.filter(timestamp < '2019-04-02 21:15:59.028121'):
... print(i.timestamp)
...
Traceback (most recent call last):
File "<console>", line 1, in <module>
NameError: name 'timestamp' is not defined
任何帮助,将不胜感激。谢谢
解决方案
当您使用过滤器方法时,您必须使用 ClassName.attribue 以便可以像这样使用您的最后一个查询:
e.report_maps.filter(Entity.timestamp < '2019-04-02 21:15:59.028121').all()
推荐阅读
- firebase - 我需要在 GCP/Firebase 中获得什么访问权限才能运行 Firebase 测试实验室
- python-3.x - 处理来自 PyPi 的两个具有相同导入名称的 Python 库?
- android - 包含卡片的 GridView 最终在 Flutter 中被修剪
- javascript - 创建正则表达式以匹配特定 URI 模式时出错
- openssl - Terraform 从 Azure Keyvault 加载 authorized_keys > pfx 证书
- stm32 - 使用 STM32 DAC 进行频率调整
- wordpress - 无法通过 FTP 删除 AWS EC2 上的文件,权限被拒绝
- matlab - 如何在 MATLAB 中生成包含这样的矩阵的图像?
- java - 如何配置从 SQS 获取消息并将它们移动到 Kafka 主题的 Kafka 连接器?
- json - 如何使用 JOLT 将数组元素和字符串转换为数组中的后续单独对象?