Files
dpb/backend/app/api/v1/module_bre/observation/model.py
T

58 lines
2.5 KiB
Python
Raw 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"),
)