TRM-coding | d1cbf67 | 2025-06-18 15:15:08 +0800 | [diff] [blame^] | 1 | # models/user.py |
| 2 | |
| 3 | from datetime import datetime |
| 4 | from extensions import db |
| 5 | |
| 6 | # 关联表:用户关注关系 |
| 7 | follows = db.Table( |
| 8 | 'follows', |
| 9 | db.Column('follower_id', db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), primary_key=True), |
| 10 | db.Column('followee_id', db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), primary_key=True), |
| 11 | db.Column('created_at', db.DateTime, default=datetime.utcnow, nullable=False) |
| 12 | ) |
| 13 | |
| 14 | class User(db.Model): |
| 15 | __tablename__ = 'users' |
| 16 | |
| 17 | id = db.Column(db.Integer, primary_key=True) |
| 18 | username = db.Column(db.String(50), unique=True, nullable=False) |
| 19 | password = db.Column(db.String(255), nullable=False) |
| 20 | email = db.Column(db.String(100), unique=True, nullable=False) |
| 21 | avatar = db.Column(db.String(255)) |
| 22 | role = db.Column(db.Enum('user', 'admin'), default='user', nullable=False) |
| 23 | bio = db.Column(db.String(255)) |
| 24 | status = db.Column(db.Enum('active', 'banned', 'muted'), default='active', nullable=False) |
| 25 | created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) |
| 26 | updated_at = db.Column( |
| 27 | db.DateTime, |
| 28 | default=datetime.utcnow, |
| 29 | onupdate=datetime.utcnow, |
| 30 | nullable=False |
| 31 | ) |
| 32 | |
| 33 | # 用户发布的帖子 |
| 34 | posts = db.relationship( |
| 35 | 'Post', |
| 36 | backref='author', |
| 37 | lazy='dynamic', |
| 38 | cascade='all, delete-orphan' |
| 39 | ) |
| 40 | |
| 41 | # 用户的互动行为 |
| 42 | behaviors = db.relationship( |
| 43 | 'Behavior', |
| 44 | backref='user', |
| 45 | lazy='dynamic', |
| 46 | cascade='all, delete-orphan' |
| 47 | ) |
| 48 | |
| 49 | # 用户发表的评论 |
| 50 | comments = db.relationship( |
| 51 | 'Comment', |
| 52 | backref='user', |
| 53 | lazy='dynamic', |
| 54 | cascade='all, delete-orphan' |
| 55 | ) |
| 56 | |
| 57 | # 用户关注的对象列表 |
| 58 | following = db.relationship( |
| 59 | 'User', |
| 60 | secondary=follows, |
| 61 | primaryjoin=(id == follows.c.follower_id), |
| 62 | secondaryjoin=(id == follows.c.followee_id), |
| 63 | backref=db.backref('followers', lazy='dynamic'), |
| 64 | lazy='dynamic' |
| 65 | ) |
| 66 | |
| 67 | def __repr__(self): |
| 68 | return f"<User {self.username!r} id={self.id}>" |