58 lines
2.5 KiB
Python
58 lines
2.5 KiB
Python
"""通用观测(EAV长表) 数据模型"""
|
|
from datetime import date
|
|
|
|
from sqlalchemy import Date, ForeignKey, Index, Integer, String, Text
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
|
|
from app.core.base_model import MappedBase, ModelMixin, UserMixin
|
|
|
|
|
|
class ObservationModel(ModelMixin, UserMixin, MappedBase):
|
|
"""通用观测 EAV 长表(§3.2;与 tree_evaluation 经统一性状值视图归一)。
|
|
|
|
EAV 通用观测:trait_id 可空(不强制挂性状),obs_value 按 obs_type
|
|
(numeric/text/date) 解释,均存 text。
|
|
"""
|
|
|
|
__tablename__ = "bre_observation"
|
|
|
|
tree_id: Mapped[int | None] = mapped_column(
|
|
Integer, ForeignKey("bre_tree.id", ondelete="CASCADE"), index=True, nullable=True, comment="单株(可空)", default=None
|
|
)
|
|
|
|
plot_id: Mapped[int | None] = mapped_column(
|
|
Integer, ForeignKey("bre_plot.id", ondelete="CASCADE"), index=True, nullable=True, comment="小区(可空)", default=None
|
|
)
|
|
|
|
germplasm_id: Mapped[int | None] = mapped_column(
|
|
Integer, ForeignKey("bre_germplasm.id", ondelete="CASCADE"), index=True, nullable=True, comment="种质资源(可空,描述性观测)", default=None
|
|
)
|
|
|
|
trait_id: Mapped[int | None] = mapped_column(
|
|
Integer, ForeignKey("bre_trait.id", ondelete="CASCADE"), index=True, nullable=True, comment="性状(可空,EAV)", default=None
|
|
)
|
|
|
|
obs_date: Mapped[date | None] = mapped_column(Date, nullable=True, comment="观测日期", default=None)
|
|
|
|
obs_year: Mapped[int | None] = mapped_column(Integer, nullable=True, comment="观测年份", default=None)
|
|
|
|
obs_value: Mapped[str | None] = mapped_column(Text, nullable=True, comment="观测值(text多态,按obs_type解释)", default=None)
|
|
|
|
obs_type: Mapped[str | None] = mapped_column(String(32), nullable=True, comment="观测类型(numeric/text/date)", default=None)
|
|
|
|
trial_study_id: Mapped[int | None] = mapped_column(
|
|
Integer, ForeignKey("bre_trial_study.id", ondelete="CASCADE"), index=True, nullable=True, comment="试验(可空)", default=None
|
|
)
|
|
|
|
operator_id: Mapped[int | None] = mapped_column(
|
|
Integer, ForeignKey("bre_personnel.id", ondelete="CASCADE"), index=True, nullable=True, comment="观测人", default=None
|
|
)
|
|
|
|
remark: Mapped[str | None] = mapped_column(String(512), nullable=True, comment="备注", default=None)
|
|
|
|
status: Mapped[int] = mapped_column(Integer, nullable=False, default=1, comment="状态(1正常/0停用)")
|
|
|
|
__table_args__ = (
|
|
Index("ix_bre_observation_created_deleted", "created_time", "is_deleted"),
|
|
)
|