Files
dpb/backend/app/api/v1/module_bre/site/model.py
T
34047007@qq.com b95053c52c init: 初始化 dpb 桃育种系统代码库
前后端 + 后端 FastAPI 全量源码、部署脚本与文档。
2026-08-06 00:17:49 +08:00

74 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""基地与试验地管理 —— 数据模型
两张无 `status` 列的域表,必须显式覆盖 `__table_args__`
只保留 `created_time` / `is_deleted` 索引(框架基类默认会加
`ix_<表>_status` 索引,但本表无 status 列,不覆盖会建表失败)。
"""
from datetime import datetime
from sqlalchemy import Float, ForeignKey, Index, Integer, String, Text, text
from sqlalchemy.orm import Mapped, mapped_column
from app.core.base_model import MappedBase, ModelMixin, UserMixin
class BreedingSiteModel(ModelMixin, UserMixin, MappedBase):
"""育种基地(试验站)主数据表。"""
__tablename__ = "bre_site"
site_name: Mapped[str] = mapped_column(
String(100), nullable=False, unique=True, comment="基地名称"
)
address: Mapped[str | None] = mapped_column(String(255), nullable=True, comment="详细地址")
area: Mapped[float | None] = mapped_column(Float, nullable=True, comment="基地面积(亩)")
longitude: Mapped[float | None] = mapped_column(Float, nullable=True, comment="经度")
latitude: Mapped[float | None] = mapped_column(Float, nullable=True, comment="纬度")
eco_type: Mapped[str | None] = mapped_column(
String(50), nullable=True, comment="生态区类型(如 华北/西北/华东/西南/东北/华南)"
)
soil_type: Mapped[str | None] = mapped_column(String(50), nullable=True, comment="土壤类型", default=None)
elevation: Mapped[int | None] = mapped_column(Integer, nullable=True, comment="海拔(m)", default=None)
remark: Mapped[str | None] = mapped_column(Text, nullable=True, comment="备注")
# 注:created_time / is_deleted 已由 ModelMixin 的 index=True 自动建索引
# (ix_bre_site_created_time / ix_bre_site_is_deleted),此处仅补一个
# 复合索引用于数据权限过滤,且必须覆盖基类默认会建的 ix_<表>_status_deleted
# (本表无 status 列,不覆盖会引用不存在的列而建表失败)。
__table_args__ = (
Index("ix_bre_site_created_deleted", "created_time", "is_deleted"),
)
class BreedingPlotModel(ModelMixin, UserMixin, MappedBase):
"""试验地块 —— 隶属于某个基地。"""
__tablename__ = "bre_plot"
site_id: Mapped[int] = mapped_column(
Integer,
ForeignKey("bre_site.id", ondelete="CASCADE"),
nullable=False,
index=True,
comment="所属基地ID",
)
plot_code: Mapped[str] = mapped_column(
String(50), nullable=False, comment="地块编号/名称"
)
row_orientation: Mapped[str | None] = mapped_column(
String(20), nullable=True, comment="行向(南北行/东西行)"
)
row_count: Mapped[int | None] = mapped_column(Integer, nullable=True, comment="行数")
col_count: Mapped[int | None] = mapped_column(Integer, nullable=True, comment="每行株数")
grid_note: Mapped[str | None] = mapped_column(Text, nullable=True, comment="株行距/网格说明")
area: Mapped[float | None] = mapped_column(Float, nullable=True, comment="地块面积(亩)")
__table_args__ = (
Index("ix_bre_plot_created_deleted", "created_time", "is_deleted"),
# 基地内地块编号唯一(仅约束未软删记录,与 service 层查重语义一致)
Index(
"uniq_bre_plot_site_code", "site_id", "plot_code",
unique=True, postgresql_where=text("is_deleted = false"),
),
)