SQLAlchemy 一对多关系 - 如何正确获取 'many' 集合
SQLAlchemy one-to-many relationship - how to properly get the 'many' collection
我不确定我是否正确理解如何获取一对多关系的集合部分。
class ProjectReport(db.Model):
__tablename__ = "project_reports"
id = db.Column(UUID, primary_key=True, default=uuid.uuid4)
project_id = db.Column(UUID, db.ForeignKey("projects.id"), nullable=False)
entries = db.relationship("ProducerEntry", backref="project_report", lazy="dynamic")
class ProducerEntry(Entry):
__tablename__ = "producer_entries"
__mapper_args__ = {"polymorphic_identity": "Entry"}
id = db.Column(UUID, db.ForeignKey("entries.id"), primary_key=True)
project_id = db.Column(UUID, db.ForeignKey("projects.id"), nullable=False)
project_report_id = db.Column(UUID, db.ForeignKey("project_reports.id"), nullable=True)
我的问题是我不能只访问 entries
字段。
for entry in self.entries:
do_something(entry)
这个returnsNotImplementedError
我设法通过 hybrid property
获取了数据,但这似乎有点矫枉过正,因为已经有了关系,而且以后的进一步逻辑会变得有点复杂。
@hybrid_property
def entries(self):
return ProducerEntry.query.filter_by(project_report_id=self.id)
Ab 附加信息是 ProjectReport
基本上是 Entry
和 Project
模型的公共列,而 project_report_id
可以为空,因为条目和首先生成项目,然后我可以从中生成项目报告。这就是我创建报告的方式:
...
project_report = ProjectReport(date_order=entry.date_order, project_id=entry.project.id)
project_report.entries.append(entry)
...
据我所知,在此之后我不必将 project_report_id
添加到制作人 entry
。
我在这里错过了什么?
是的,那个关系字段 returns 是一个查询,所以我应该调用:
self.entries.all()
或任何其他正在处理查询的东西。
我不确定我是否正确理解如何获取一对多关系的集合部分。
class ProjectReport(db.Model):
__tablename__ = "project_reports"
id = db.Column(UUID, primary_key=True, default=uuid.uuid4)
project_id = db.Column(UUID, db.ForeignKey("projects.id"), nullable=False)
entries = db.relationship("ProducerEntry", backref="project_report", lazy="dynamic")
class ProducerEntry(Entry):
__tablename__ = "producer_entries"
__mapper_args__ = {"polymorphic_identity": "Entry"}
id = db.Column(UUID, db.ForeignKey("entries.id"), primary_key=True)
project_id = db.Column(UUID, db.ForeignKey("projects.id"), nullable=False)
project_report_id = db.Column(UUID, db.ForeignKey("project_reports.id"), nullable=True)
我的问题是我不能只访问 entries
字段。
for entry in self.entries:
do_something(entry)
这个returnsNotImplementedError
我设法通过 hybrid property
获取了数据,但这似乎有点矫枉过正,因为已经有了关系,而且以后的进一步逻辑会变得有点复杂。
@hybrid_property
def entries(self):
return ProducerEntry.query.filter_by(project_report_id=self.id)
Ab 附加信息是 ProjectReport
基本上是 Entry
和 Project
模型的公共列,而 project_report_id
可以为空,因为条目和首先生成项目,然后我可以从中生成项目报告。这就是我创建报告的方式:
...
project_report = ProjectReport(date_order=entry.date_order, project_id=entry.project.id)
project_report.entries.append(entry)
...
据我所知,在此之后我不必将 project_report_id
添加到制作人 entry
。
我在这里错过了什么?
是的,那个关系字段 returns 是一个查询,所以我应该调用:
self.entries.all()
或任何其他正在处理查询的东西。