guideCity/backend/app/models/place.py

39 lines
1.7 KiB
Python
Raw Normal View History

from datetime import datetime
from geoalchemy2 import Geography
from sqlalchemy import Boolean, DateTime, Enum, ForeignKey, String, Text, func
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.db.base import Base
from app.models.enums import PlaceCategory
class Place(Base):
__tablename__ = "places"
id: Mapped[int] = mapped_column(primary_key=True)
city_id: Mapped[int] = mapped_column(ForeignKey("cities.id", ondelete="CASCADE"), nullable=False)
slug: Mapped[str] = mapped_column(String(128), unique=True, nullable=False)
category: Mapped[PlaceCategory] = mapped_column(
Enum(PlaceCategory, name="place_category", native_enum=True), nullable=False
)
location = mapped_column(
Geography(geometry_type="POINT", srid=4326, spatial_index=False), nullable=False
)
address: Mapped[str | None] = mapped_column(String(256))
district: Mapped[str | None] = mapped_column(String(128))
built_year: Mapped[str | None] = mapped_column(String(32))
architect_builder: Mapped[str | None] = mapped_column(String(256))
architectural_style: Mapped[str | None] = mapped_column(String(128))
notable_people: Mapped[str | None] = mapped_column(Text)
is_active: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
)
city: Mapped["City"] = relationship(back_populates="places")
contents: Mapped[list["PlaceContent"]] = relationship(
back_populates="place", cascade="all, delete-orphan"
)