2025-07-04 19:07:35 +08:00

80 lines
2.8 KiB
Python

"""
用户地址模型
"""
from datetime import datetime
from config.database import db
class UserAddress(db.Model):
"""用户地址模型"""
__tablename__ = 'user_addresses'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
receiver_name = db.Column(db.String(50), nullable=False)
receiver_phone = db.Column(db.String(20), nullable=False)
province = db.Column(db.String(50), nullable=False)
city = db.Column(db.String(50), nullable=False)
district = db.Column(db.String(50), nullable=False)
detail_address = db.Column(db.String(200), nullable=False)
postal_code = db.Column(db.String(10))
is_default = db.Column(db.Integer, default=0)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# 关联关系
user = db.relationship('User', backref='addresses')
def get_full_address(self):
"""获取完整地址"""
return f"{self.province} {self.city} {self.district} {self.detail_address}"
def to_dict(self):
"""转换为字典"""
return {
'id': self.id,
'user_id': self.user_id,
'receiver_name': self.receiver_name,
'receiver_phone': self.receiver_phone,
'province': self.province,
'city': self.city,
'district': self.district,
'detail_address': self.detail_address,
'postal_code': self.postal_code,
'full_address': self.get_full_address(),
'is_default': self.is_default,
'created_at': self.created_at.isoformat() if self.created_at else None
}
@classmethod
def set_default_address(cls, user_id, address_id):
"""设置默认地址"""
try:
# 先取消所有默认地址
cls.query.filter_by(user_id=user_id).update({'is_default': 0})
# 设置新的默认地址
address = cls.query.filter_by(id=address_id, user_id=user_id).first()
if address:
address.is_default = 1
db.session.commit()
return True
return False
except Exception:
db.session.rollback()
return False
@classmethod
def get_default_address(cls, user_id):
"""获取默认地址"""
return cls.query.filter_by(user_id=user_id, is_default=1).first()
@classmethod
def get_user_addresses(cls, user_id):
"""获取用户所有地址"""
return cls.query.filter_by(user_id=user_id).order_by(
cls.is_default.desc(), cls.created_at.desc()
).all()
def __repr__(self):
return f'<UserAddress {self.receiver_name}-{self.get_full_address()}>'