from uuid import uuid4 from sqlalchemy.orm import relationship from sqlalchemy.sql.schema import Column, ForeignKey as FKey from sqlalchemy.sql.sqltypes import Integer, String, Unicode from sqlalchemy_utils.types import CountryType, UUIDType from .base import AbstractBase __all__ = [ 'StateProvince', 'City', 'Street', 'Address', ] class StateProvince(AbstractBase): __tablename__ = 'state_province' id = Column(Integer, primary_key=True) country = Column(CountryType, nullable=False, index=True) name = Column(Unicode(255), nullable=False, index=True) cities = relationship('City', backref='state_province', lazy='selectin') class City(AbstractBase): __tablename__ = 'city' id = Column(Integer, primary_key=True) state_province_id = Column(Integer, FKey('state_province.id', ondelete='RESTRICT'), nullable=False, index=True) zip_code = Column(String(5), nullable=False, index=True) name = Column(Unicode(255), nullable=False, index=True) streets = relationship('Street', backref='city', lazy='selectin') class Street(AbstractBase): __tablename__ = 'street' id = Column(Integer, primary_key=True) city_id = Column(Integer, FKey('city.id', ondelete='RESTRICT'), nullable=False, index=True) name = Column(Unicode(255), nullable=False, index=True) addresses = relationship('Address', backref='street', lazy='selectin') class Address(AbstractBase): __tablename__ = 'address' id = Column(UUIDType, primary_key=True, default=uuid4) street_id = Column(Integer, FKey('street.id', ondelete='RESTRICT'), nullable=False, index=True) house_number = Column(String(8), nullable=False) supplement = Column(String(255))