Files

58 lines
2.6 KiB
Python
Raw Permalink Normal View History

"""性状字典 数据模型"""
from datetime import datetime
from sqlalchemy import Float, ForeignKey, Index, Integer, String, Text
from sqlalchemy.orm import Mapped, mapped_column
from app.core.base_model import MappedBase, ModelMixin, UserMixin
class TraitModel(ModelMixin, UserMixin, MappedBase):
"""性状字典 主数据表。"""
__tablename__ = "bre_trait"
trait_code: Mapped[str] = mapped_column(
String(64), nullable=False, unique=True, comment="性状编码"
)
trait_name: Mapped[str] = mapped_column(String(128), nullable=False, comment="性状名称")
category: Mapped[str | None] = mapped_column(String(32), nullable=True, comment="性状类别", default=None)
data_type: Mapped[str] = mapped_column(String(16), nullable=False, default="numeric", comment="数据类型")
unit: Mapped[str | None] = mapped_column(String(16), nullable=True, comment="单位", default=None)
is_core: Mapped[str] = mapped_column(String(1), nullable=False, default="1", comment="是否核心性状")
scale_json: Mapped[str | None] = mapped_column(Text, nullable=True, comment="量规/分级JSON", default=None)
valid_min: Mapped[float | None] = mapped_column(Float, nullable=True, comment="有效最小值", default=None)
valid_max: Mapped[float | None] = mapped_column(Float, nullable=True, comment="有效最大值", default=None)
ontology_uri: Mapped[str | None] = mapped_column(String(255), nullable=True, comment="本体IRI", default=None)
stage: Mapped[str] = mapped_column(String(16), nullable=False, default="evaluation", comment="测定阶段(juvenile幼龄/evaluation成株)")
method: Mapped[str | None] = mapped_column(String(256), nullable=True, comment="测定方法", default=None)
method_uri: Mapped[str | None] = mapped_column(String(256), nullable=True, comment="测定方法URI", default=None)
direction: Mapped[str] = mapped_column(
String(16), nullable=False, default="desc", comment="性状方向(desc越大越好/asc越小越好)"
)
into_ebv: Mapped[str] = mapped_column(
String(1), nullable=False, default="1", comment="是否选种目标(1是/0否)"
)
default_h2: Mapped[float | None] = mapped_column(
Float, nullable=True, default=None, comment="先验遗传力h²(实测缺失时兜底)"
)
remark: Mapped[str | None] = mapped_column(Text, nullable=True, comment="备注", default=None)
# 无 status 列:覆盖基类默认 ix_<表>_status_deleted 索引,
# 仅保留 (created_time, is_deleted) 复合索引用于数据权限过滤。
__table_args__ = (
Index("ix_bre_trait_created_deleted", "created_time", "is_deleted"),
)