Files

58 lines
2.5 KiB
Python
Raw Permalink Normal View History

"""通用观测(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"),
)